如何把多个对象序列化并存入同一个文件,然后读取和修改仅仅读取需要的那个就行?

Bolang8383 2016-12-19 09:41:49
比如:
[Serializable]
public class AA
{
public string[] string_sz { set; get; }
}
public void try()
{
string[] aa={"a1","b1","c1"};
string[] bb={"a2","b2","c2","d2"};
string[] cc={"a3","b3","c3","d3","e3","f3"};
string[] dd={"a4","b4","c4"};
AA a=new AA();
a.string_sz =aa;

AA b=new AA();
b.string_sz =bb;

AA c=new AA();
c.string_sz =cc;

AA d=new AA();
d.string_sz =dd;
}

我的要求就是:
a,b,c,d存入同一个文件,文件名是:xxx.dat
然后后边在读取时,比如说,我要读取c,那么仅仅读取c而已,不需要把整个xxx.dat内容加载进内存再选择c。
同样道理,比如我要修改b,那么我就仅仅修改b,而不是把整个xxx.dat内容加载进内存,修改b,再覆盖整个xxx.dat。
不用告诉我存进数据库,不能存入数据库的。
谢谢各位了
...全文
565 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2016-12-20
  • 打赏
  • 举报
回复
当然可以 你只要知道 a,b,c,d 保存在 xxx.dat 中时,各自的偏移和长度就可以了 如果回写时 a,b,c,d 的长度可能会变长,那么你可以在一开始就预留一些空间
by_封爱 版主 2016-12-20
  • 打赏
  • 举报
回复
LZ想多了..只有"数据库"才有这样的功能.否则你开发的 叫什么dat 其实就是txt.. 想读取任意一行 那是不可能的.. 放弃吧
  • 打赏
  • 举报
回复
我已经不可能告诉你“如何设计这样的程序”的问题。因为你说了比较无厘头的话,我只告诉你一点常识。 要想这样都写文件,你就是要根据数据库原理来设计系统。不知道你自己想问题时,以后能否成熟一点?
  • 打赏
  • 举报
回复
引用 楼主 Bolang8383 的回复:
不用告诉我存进数据库,不能存入数据库的。 谢谢各位了
数据库通常也就是一个文件,文件中包括了各种表、索引、存储过程等等数据库对象的数据。 所以你要是想自己开发这样一个“文件”,你就等于自己要开发一个小型数据库系统。你如果没有一丁点耐心去学好数据库设计原理(不是扯什么“数据库使用”,是指“开发原理”),那么你就的问题就等于无厘头的悖论。 如果你懂数据库原理,你就能自己编写程序作为数据库系统,将多个对象序列化到文件,并且可以支持索引、随机读取、随机扩展文件等等功能。否则就是幼稚地否定什么“数据库”概念,而不会建设。
m0_37117374 2016-12-20
  • 打赏
  • 举报
回复
同学,你的这个想法很可怕啊。如果序列化的实体没有关联对象那无所谓,如果有关联实体,而且这个关联还牵扯到了其他的实体。无法想象你要储存的这个文件里会是什么模样。
  • 打赏
  • 举报
回复
那你还不如用XPath + XLinq
华芸智森 2016-12-20
  • 打赏
  • 举报
回复
1. BASE64后直接读写 INI 。 2.将数据分为固定长度的项。例如: 1024 .每项最大就是保存1024 . 这就相当于一个链表来操作(相对而言,比INI麻烦)。
正怒月神 2016-12-20
  • 打赏
  • 举报
回复
你不存sql,那存access, 不存access,那存excel也比txt强啊
  • 打赏
  • 举报
回复
那你a,b,c,d各自写入自己对应的文件不就行了 否则除非你的每个数据长度固定,这样可以根据行数来取
闭包客 2016-12-20
  • 打赏
  • 举报
回复
windows 有 api 可以控制读写指针,从文件的中间读起的。.net 里面应该也有相应的封装。这是很基本的功能。 那么文件的哪个地方才是目标数据呢,这又需要你建立索引了。
brucel51 2016-12-20
  • 打赏
  • 举报
回复
1.写 存入多个文件-》压缩合并成自定义的一个文件 2.读 解压自定义的文件-》读取对应文件名的文件
Bolang8383 2016-12-19
  • 打赏
  • 举报
回复
引用 1 楼 tcmakebest 的回复:
作为文件本身,如果中间要加增或者减少一个字节, 那后面的所有字节都要重新写入的, 不然就错位了. 所以楼主不要考虑那么多了.
那么读取呢??有没有办法做到仅仅读取c而已,不需要把整个xxx.dat内容加载进内存再选择c。
tcmakebest 2016-12-19
  • 打赏
  • 举报
回复
作为文件本身,如果中间要加增或者减少一个字节, 那后面的所有字节都要重新写入的, 不然就错位了. 所以楼主不要考虑那么多了.

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧