为了账号安全,请及时绑定邮箱和手机立即绑定

C# 怎么序列化多个不同的对象在文件内,然后依次反序列化取出。在线等求指教

C# 怎么序列化多个不同的对象在文件内,然后依次反序列化取出。在线等求指教

大话西游666 2018-12-06 17:31:22
有三个对象,依次用二进制方式序列化到文件中,然后依次取出来。应该怎么做,第一个对象取出来成功了,但是取第二个对象的时候出现了错误:在分析完成之前遇到了流结尾 namespace ConsoleApplication5{ class Program { static void Main(string[] args) { Serialize(); Deserialize(); } static void Serialize() { A a = new A(); FileStream fs = new FileStream("DataFile.dat", FileMode.Open); BinaryWriter bw = new BinaryWriter(fs); MemoryStream ms = new MemoryStream(); // Construct a BinaryFormatter and use it to serialize the data to the stream. BinaryFormatter formatter = new BinaryFormatter(); try { formatter.Serialize(ms, a); byte[] tem = new byte[(int)ms.Length]; ms.Seek(0, SeekOrigin.Begin); ms.Read(tem, 0, (int)ms.Length); bw.Write(tem); ms.Close(); ms = new System.IO.MemoryStream(); string p = "123"; formatter.Serialize(ms, p); byte[] tem1 = new byte[(int)ms.Length]; ms.Seek(0, SeekOrigin.Begin); ms.Read(tem1, 0, (int)ms.Length); bw.Seek(0, SeekOrigin.End); bw.Write(tem1); bw.Flush(); bw.Close(); } catch (SerializationException e) { Console.WriteLine("Failed to serialize. Reason: " + e.Message); throw; } finally { //fs.Close(); } } static void Deserialize() { FileStream fs = new FileStream("DataFile.dat", FileMode.Open); BinaryFormatter formatter = new BinaryFormatter(); MemoryStream ms = new System.IO.MemoryStream(); byte[] a = new byte[145]; fs.Read(a, 0, 145); ms.Write(a, 0, 145); object x = formatter.Deserialize(ms); Console.WriteLine(x.GetType()); byte[] b = new byte[27]; fs.Seek(145, SeekOrigin.Begin); fs.Read(b,0,27); ms.Write(b, 0, 27); x = formatter.Deserialize(ms); Console.WriteLine(x.GetType()); fs.Close(); } } [Serializable] class A { string x = "122"; }}
查看完整描述

11 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

最简单的方式,把三个对象组合成一个大对象: public class Big {public A a;public B b;public C c;}
查看完整回答
反对 回复 2018-12-09
?
撒科打诨

TA贡献1934条经验 获得超2个赞

这快设计到东西很多,很难几行或者几十行搞定。可以去用下NDatabase,或者看下那个的代码。主要就是解决这个问题的。
查看完整回答
反对 回复 2018-12-09
?
慕沐林林

TA贡献2016条经验 获得超9个赞

这么复杂啊。。。。我觉得就是序列化成二进制然后存入文件,然后依次按长度取出
查看完整回答
反对 回复 2018-12-09
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

@大芝麻: 如果只是简单的存储  然后拿出来,并且就是几个几十个对象直接序列化反序列化,直接用json存储吧。
查看完整回答
反对 回复 2018-12-09
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

@imfunny:Json存储确实可行不过,存储的数据有能够直观的看出来内部信息。谢了
查看完整回答
反对 回复 2018-12-09
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

在序列化时,三个对象之间是如何分隔的?
查看完整回答
反对 回复 2018-12-09
?
Helenr

TA贡献1780条经验 获得超4个赞

@大芝麻: 那问题可能出在读取流的操作时,在反序列化第2个对象时,流的读取指针已经跑到了流的结尾
查看完整回答
反对 回复 2018-12-09
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

@dudu:  推荐阅读一个系列博文(重点是第5篇): C# 温故而知新:Stream篇(—) C# 温故而知新:Stream篇(二) C# 温故而知新:Stream篇(三) C# 温故而知新:Stream篇 (四) C# 温故而知新:Stream篇(五) C# 温故而知新:Stream篇(六)
查看完整回答
反对 回复 2018-12-09
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

@dudu: 如你所说就是指针位置不正确导致的
查看完整回答
反对 回复 2018-12-09
?
炎炎设计

TA贡献1808条经验 获得超4个赞

做一个结构体,然后把结构体按序追加到文件中,C++存储数据的模式都这样,可以去看看大智慧的数据存储方式。
查看完整回答
反对 回复 2018-12-09
  • 11 回答
  • 0 关注
  • 1032 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信