CYQ.Data.Xml XmlHelper 助你更方便快捷的操作Xml/Html
关于爱说说在技术选型的文章见:"爱说说"技术原理方案的定选思考过程
本篇将讲述“爱说说”比较重大的技术问题点及解决手段:
杂说几句:
一开始,原本是打算在秋式开源团队找一JS人才来引导前台页面的呈现的,毕竟本人在JS还停留在原始的编码阶段,于是当时聊了一下。
再后来,接下来几天,由于秋式开源团队内部管理上有点小调整,还有新开任务小组的事,连续忙了几天,“爱说说”就也停了几天。
几天过后,回到群里Call人,发现原来JS的人才一去无踪影了,没法只好自己动手了。
在定好技术方案后,下面开始技术的分析:
“爱说说”的逻辑:
从后端Ashx说起:
一:TXT文本交互的技术解析
1:数据写入:每次往文本的最后面写一条Json数据,语句很简单:
{
File.AppendAllText(FilePath, appendText);
}
利用System.IO.File类即可轻松处理。
2:数据读取:内存表缓存失效时,需要重新加载TXT文本的Json数据,语句也很简单:
{
return File.ReadAllText(FilePath);
}
还是一行代码,处理简单。
3:删除功能:需要移除TXT文本内的某行Json数据,也很容易的说:
{
File.WriteAllText(FilePath, File.ReadAllText(FilePath).Replace(removeText, string.Empty));
}
还是一行的说,读完替换,然后重新写入。
OK,和IO的交互设计,相当的简洁,也就这三个函数了,写,读,删除。
二:Json的交互的技术解析
1:数据如何写入:
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:另一个重大的技术问题
一切看似很好,可是后面还是会有些问题呢的,什么问题?往下看:
看一下表格的原始属性:
表格的基本列:
_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字段架构如下:
于是,解析时,就可以准确的还原了,那如何输出这行架构行?
三:总结
解决了这两个重大的技术难题,接下来的,还有没有其它技术问题?
还有没有?
下节解说,敬请期待。
关注点:MDataTable在“爱说说”扩展了这么多强劲的功能,啥时候发布?
很快,可能是五一前后:会在 CYQ.Data V4.5正式版中集成,也敬请期待与关注。
版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:
http://www.cnblogs.com/cyq1162/archive/2011/04/24/2026235.html

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
秋色园QBlog高性能博客开放源码下载 限量下载1000次
写在开源前的几句话: 1:本次开放的源码为V1.0版本源码,限量下载,次数为1000次。 PS:目前下载量已近1000次,准备停止对外下载了,如果你是第1000次以外的下载者,想获取源码,你可以按以下方法进行: 请留言有意义的评论,并附上你的邮箱地址,对认真评论的人将直接发送源码到你的邮箱中[最多只发50人],对于只留邮箱,不带其它正面评论的,我就省点力不发了。 再PS:50个邮件名额已满,源码将不再发送。后来者只能说声Sorry,秋色园V1.0 版本源码将进入不定期封源状态。 2:使用源码请请先阅读源码里的“开源协议及商业授权协议说明.txt” 3:打酱油的,观光的,懒人,扮清高的,骂阵的,非诚打扰。 4:秋色园整体架构及代码整体难度偏中上,新手研究可能有点吃力,但只要你是真心想研究,想学习,想进步,我就义无反顾的为你解答。 5:这是一套创新的经典的架构与精华的代码,无论何种层次的开发人员只要用心研究,相信都能得到不少思想的提升与灵感。 6:你将看到的源码与架构,不是webform,不是mvc,是的,.NET原来还能这么用,这么写,这么的不同寻常。 CYQ.Blog(简称Q...
- 下一篇
CYQ.Data 轻量数据层之路 V4.3 版本发布[增加对SQLite,MySQL数据库的支持]
前言: 继上一版本:CYQ.Data 轻量数据层之路 V4.0 版本发布,又过去一个来月了,不过也过了一个新年了。 由于过年原因,因此框架也没多折腾什么,只是年前年后顺路把SQLite,MySQL两种数据库给支持上了。 提示:基于网友的提醒,本次版本发布带CYQ.Data.xml,增加了方法的中文提示。 下面看一下新版本的修改记录 1:MAction的构造函数允许从MDataRow加载 2:MutilLanguage在设置Cookie时也同时设置语言标识 3:MutilLanguage默认语言取自浏览器语言 4:取消CYQ.Data.SQL.OutPutData类及两个相关枚举TableType|DataBaseType,将[生成枚举|创建分页存储过程|创建日志表]等操作单独移到辅助工具实现 5:取消ProcedureSql,新增SchemaAction来获取表架构数据 6:增加对SQLite数据的支持 9:MAction增加从Json反加载数据填充 7:增加对MySql数据库的支持 8:提升数据表架构的缓存级别:MDataColumn->MDataRow 下面进行详细...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题