我有一个单一文件,需要随机序列化多个对象。 我怎么能在c#中?
我有一个文件,需要在创建新对象时序列化同一个类的多个对象。 我无法将它们存储在数组中,因为我需要将对象创建的实例序列化它们。 请帮我。
你使用什么序列化机制? XmlSerializer
可能是一个问题,因为根节点和命名空间声明之类的东西,这有点难以获得 – 加上它在部分反序列化方面并不是很好。 BinaryFormatter
开始时非常脆弱 – 在大多数情况下我不推荐它。
一种选择可能是protobuf-net ; 这是一个二进制序列化器(使用谷歌的“协议缓冲”格式 – 高效,可移植和版本容忍)。 您可以使用Serializer.SerializeWithLengthPrefix
将多个对象序列化为流。 要反Serializer.DeserializeItems
相同的项, Serializer.DeserializeItems
返回反Serializer.DeserializeItems
项的IEnumerable
– 或者您可以轻松地将TryDeserializeWithLengthPrefix
公开(它当前是私有的,但源是可用的)。
只需在创建文件后将每个对象写入文件即可 – 完成工作。
如果你想要一个例子,请说 – 尽管这里的unit testing给出了概述。
它基本上就像(未经测试):
using(Stream s = File.Create(path)) { Serializer.SerializeWithLengthPrefix(s, command1, PrefixStyle.Base128, 0); ... your code etc Serializer.SerializeWithLengthPrefix(s, commandN, PrefixStyle.Base128, 0); } ... using(Stream s = File.OpenRead(path)) { foreach(Command command in Serializer.DeserializeItems (s, PrefixStyle.Base128, 0)) { ... do something with command } }
见这里的答案。
简而言之,只需将所有内容序列化到同一个文件流,然后反序列化即可。 dotNet会知道每个对象的大小
对于到达的每个对象,我们将其转换为Base64Encoded字符串并将其作为一行存储在文本文件中。 因此,在此文件中,每行每行都有一个序列化对象。 在读取时,我们将一次读取一行文件,并将此Base64编码的字符串反序列化为Object。 容易..所以让我们试试代码。
http://www.codeproject.com/KB/cs/serializedeserialize.aspx?display=Print