关于爱说说在技术选型的文章见:"爱说说"技术原理方案的定选思考过程

本篇将讲述“爱说说”比较重大的技术问题点及解决手段:

爱说说:http://speak.cyqdata.com/

杂说几句:

一开始,原本是打算在秋式开源团队找一JS人才来引导前台页面的呈现的,毕竟本人在JS还停留在原始的编码阶段,于是当时聊了一下。

再后来,接下来几天,由于秋式开源团队内部管理上有点小调整,还有新开任务小组的事,连续忙了几天,“爱说说”就也停了几天。

几天过后,回到群里Call人,发现原来JS的人才一去无踪影了,没法只好自己动手了。

在定好技术方案后,下面开始技术的分析:

“爱说说”的逻辑:

前端html-》发送ajax请求-》后端ashx处理并返回Json-》前端接收Json并解析显示

从后端Ashx说起:

一:TXT文本交互的技术解析

1:数据写入:每次往文本的最后面写一条Json数据,语句很简单:

        public void AppendText(string appendText)
        {
            File.AppendAllText(FilePath, appendText);
        }

利用System.IO.File类即可轻松处理。

2:数据读取:内存表缓存失效时,需要重新加载TXT文本的Json数据,语句也很简单:

        public string LoadText()
        {
            return File.ReadAllText(FilePath);
        }

还是一行代码,处理简单。

3:删除功能:需要移除TXT文本内的某行Json数据,也很容易的说:

        public void RemoveText(string removeText)
        {
            File.WriteAllText(FilePath, File.ReadAllText(FilePath).Replace(removeText, string.Empty));
        }

还是一行的说,读完替换,然后重新写入。

OK,和IO的交互设计,相当的简洁,也就这三个函数了,写,读,删除。

二:Json的交互的技术解析

1:数据如何写入:

从上面的分析上看,提交肯定是一行一行的数据,于是每次写入都是一条Json语句。

2:功能冲突:这和CYQ.Data.Table下的MDataTable的功能有什么冲突?

MDataTable有ToJson功能,也有LoadFromJson功能,能把数据表转成Json,也能从Json解析还原成内存表。

那数据行有没有ToJson功能?答案,没有!

替换方案可有?答案,有! 可以MDataRow.ToTable().ToJson(),即转成表格再输出Json,看似挺好。

在好之前,看一下MDataTable的ToJson()输出什么?

{"count":"2","error":"","success":"true","data":[
{"ID":"2","ParentID":"-1","UserID":"2","NickName":"dddd","Body":"aaddd","CreatedOn":"2011-4-24 0:22:21"},
{"ID":"1","ParentID":"-1","UserID":"1","NickName":"dddd","Body":"aaaaa","CreatedOn":"2011-4-24 1:19:37"}]}

格式就是这个了,前面是一些共有属性,data内才是数据行。

如果每次把这样的数据写完文本,到时候读取解析还原成表格,肯定有问题。

3:如何解决冲突:扩展功能,为单独的数据行添加ToJson()功能

只单独输出:

{"ID":"2","ParentID":"-1","UserID":"2","NickName":"dddd","Body":"aaddd","CreatedOn":"2011-4-24 0:22:21"}

这样子,重复的往后写,感觉就省了点字节,而且也清爽秀多。

4:扩展再扩展:MDataTable.LoadFromJson要支持上

不过这么重复的写单行Json数据,再读取,MDataTable是解析不了的,咋整?

解析不了就扩展一下,把它解析了,由于CYQ.Data的Json,都是本人手动写的解析。

所以,修改来解析这样一行一行的数据,还是可以处理的。三改两改就支持上了,一切很好。

现状就是可以往TXT里写出这么一系列的文本了:

{"ID":"1","ParentID":"-1","UserID":"1","NickName":"小样...","Body":"爱说说...有话就说",第一个哟哟","CreatedOn":"4/20/2011 8:35:10 AM"}

{"ID":"2","ParentID":"-1","UserID":"2","NickName":"路过秋天","Body":"不知道怎么回事说,随便来几字,明字何期多。","CreatedOn":"4/20/2011 8:37:35 AM"}

再然后就是MDataTable.LoadFromjson又可以从这种格式还原成内存表了。

技术手段到了这里,光明灿烂了。

一切流程很好:

1:客户端提交数据-》

2:Ashx提交数据-》写入内存表,然后把数据行ToJson写入文本。

3:内存表在内存,总有失效的时候,失效时LoadFromJson又还原成表格,又继续。

5:另一个重大的技术问题

一切看似很好,可是后面还是会有些问题呢的,什么问题?往下看:

看一下表格的原始属性:

内在表定义:        private static MDataTable _Table = null;//内存数据表

表格的基本列:

                        _Table.Columns.Add("ID", SqlDbType.Int);//ID标识
                        _Table.Columns.Add("ParentID", SqlDbType.Int);//>0说明是回贴
                        _Table.Columns.Add("UserID", SqlDbType.Int);
                        _Table.Columns.Add("NickName", SqlDbType.NVarChar);
                        _Table.Columns.Add("Body", SqlDbType.NVarChar);//内容
                        _Table.Columns.Add("CreatedOn", SqlDbType.DateTime);//创建日期

问题:

在开始定义前,都是有不同的类型的,但如果内在表失效时,重新还原又是什么状况?

由于Json全是字符串,在还原为内存表MDataTable时,默认全都置为SqlDbType.NVarChar,

于是表格的字段类型全变字符串了,如果只是还原后用于绑定显示就没啥问题了,如果此表格还需要进行一些复杂判断比较,就比较纠结了。

正如我要查询ID>数字的行,全是字符串就真的很纠结。

如何解决?

想法一:有想法不是办法:

开始纠结还原后的数据类型问题,通过判断第一行Json的文本值,来定义设置字段类型,比如:

检测值是数字型:就Int。

检测值是日期型:就DateTime

最后就默认给:NVarChar

为何不是办法?

看似挺好,如果文本字段内容第一行是数字,其它行又是字符串呢?后面的内容不就纠结了?

想法二:有想法也是办法:

既然首行取值判断不行,如果首行存表架构呢?

首行Json字段架构如下:

{"ID":"System.Int32","ParentID":"System.Int32","UserID":"System.Int32","NickName":"System.String","Body":"System.String","CreatedOn":"System.DateTime"}

于是,解析时,就可以准确的还原了,那如何输出这行架构行?

于是,MDataColumn也多了个ToJson功能,用于输出表架构,至此,Json的交互方面,也大功告成了!

三:总结

解决了这两个重大的技术难题,接下来的,还有没有其它技术问题?

有,查询功能,即将扩展的MDataTable.Select(......)功能。

还有没有?

大的没了,还有就是技术细节问题了,如:接收参数,定义文本路径,定义最大行ID等。

下节解说,敬请期待。

关注点:MDataTable在“爱说说”扩展了这么多强劲的功能,啥时候发布?

很快,可能是五一前后:会在 CYQ.Data V4.5正式版中集成,也敬请期待与关注。

转载于:https://www.cnblogs.com/cyq1162/archive/2011/04/24/2026235.html

爱说说技术原理:与TXT交互及MDataTable对Json的功能扩展(二)相关推荐

  1. 爱说说技术原理:前后台参数约定及逻辑代码(三)

    上一节:"爱说说"技术原理:与TXT交互及MDataTable对Json的功能扩展 中, 我们解决了TXT数据存储和Json的交互问题,本节,看一下后台的业务逻辑: 爱说说:htt ...

  2. 大数据技术原理与应用 第三版 林子雨 期末复习(二) Hadoop HDFS HBase

    大数据技术原理与应用 第三版 林子雨 期末复习(二) Hadoop HDFS HBase Hadoop生态系统 HDFS HDFS结构 块 Name Node与Second Name Node与Dat ...

  3. 爱说说技术原理方案的定选思考过程(一)

    最近花了三天,写了秋色园的另一个频道,"爱说说"频道:http://speak.cyqdata.com/. 今天把"爱说说"的起源及技术方案的选型过程及想法给大 ...

  4. 0基础也能看懂的二维码生成器 API 的技术原理(附Java 接入代码)

    写在前面 二维码生成器 API 是一种将文本或 URL 转换为二维码图像的技术.在现代生活中,二维码已经成为了很多人生活中不可或缺的一部分,因为它们可以快速识别.易于存储,并具有可靠性.但是,大多数人 ...

  5. cyq.data 连接mysql_CYQ.Data V5文本数据库技术原理解密

    前言: 这两天有点感冒状态,除了以前折腾 微博粉丝精灵 腾到三更,最近也在折腾个别工具到四更,偶尔心来心潮,赶紧写写文章,最近有很多朋友对CYQ.Data V5里的文本数据库感兴趣,这里就给大伙说下文 ...

  6. 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)

    2019独角兽企业重金招聘Python工程师标准>>> 上节概要: 上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六)  中, 介绍了 ...

  7. 一文读懂语音识别技术原理

    https://www.toutiao.com/a6651440650308813319/ 2019-01-28 15:06:47 语音识别是十年来发展最快的技术之一,随着AI的不断发展,深度学习让语 ...

  8. 秋色园QBlog技术原理解析:Web之页面处理-内容填充(八)

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

  9. JVM SandBox 的技术原理与应用分析

    原文:https://www.infoq.cn/article/TSY4lGjvSfwEuXEBW*Gp 一.前言 在开始之前,我们先来模拟一下以下的场景: 小李:"小明,你的接口没有返回数 ...

最新文章

  1. List集合中两种遍历方式
  2. Azkaban的Web Server源码探究系列20:resolvebuildFlow
  3. Linux命令更新系统时间,更新所有文件的时间(转)
  4. 使用Gradle – 2019版从Travis可靠发布到Maven Central
  5. java uipath_10.3 UiPath如何调用Java
  6. 牛客15666 又见斐波那契(矩阵快速幂)
  7. 《软件需求分析(第二版)》第 13 章——需求开发面临的特殊难题 重点部分总结
  8. html ajax 菊花,Ajax加载菊花loding效果
  9. python迭代对象_Python迭代对象与迭代器
  10. websphere配置oracle数据源,Websphere - 配置Oracle数据源
  11. this is a test
  12. Eclipse导入GitHub上面项目的两处报错处理
  13. 图像处理中各种边缘检测的微分算子简单比较(Sobel,Robert, Prewitt,Laplacian,Canny) 【转】
  14. 使用JavaScript将图片保存至本地
  15. centos系统下搭建网站环境 php+mysql+apache
  16. Atlas Resources
  17. 欧专局对同族专利的详解
  18. 通过webService下载sharepoint文档库文件
  19. PS图片的两种大小及修改,psd源码文件,图层概念
  20. 基于云开发的校园社区小程序 微信小程序开发实战 课设作业

热门文章

  1. 12个球问题--微软面试题
  2. 爱因斯坦牛顿达尔文投胎中国后
  3. Windows下使用gvim格式化xml文件
  4. c语言如何打印矩形图形的程序 五行七列,C语言习题与实验
  5. move std 函数 示例_确保(值类型)可拷贝类有默认构造函数
  6. python字符串操作_浅谈Python 字符串特有的操作方法
  7. java同步方法完成案例_Java同步代码块和同步方法原理与应用案例详解
  8. 9月往后推6个月是几月_成考每年一般几月份颁发毕业证书
  9. 【Guava】使用Guava的RateLimiter做限流
  10. 汇编程序:输数字,出字母