我得到了Protobuf-net的源代码,该源代码将对象序列化为文件。
var person = new Person {
Id = 12345, Name = "Fred",
Address = new Address {
Line1 = "Flat 1",
Line2 = "The Meadows"
}
};
using (var file = File.Create("person.bin")) {
ProtoBuf.Serializer.Serialize(file, person);
}
但是,假设我有两个要序列化为单个文件的Person实例。我怎样才能做到这一点?
最佳答案
从纯粹的意义上来说,protobuf除了文件的末尾外没有任何“终结符”(这是为了使对象可以简单地通过串联blob进行合并/合并)。
但是,我们可以注入自己的标记,例如,通过为每个对象加上后面的数据长度作为前缀。
protobuf-net通过公开SerializeWithLengthPrefix
方法对此进行了总结。有多种方法可以反序列化此方法,但是最简单的方法是DeserializeItems
,它依次为您提供对象的流序列(从迭代器的流中懒惰地假脱机-因此非常适合非常大的序列)。
有关信息,因此您可以看到它是如何实现的:如果使用PrefixStyle.Base128
和正数fieldNumber
,则在电线上看起来就像有包装对象一样:
[ProtoContract]
public class DoesNotExist {
[ProtoMember({fieldNumber})]
public List<Person> People {get;set;}
}
主要区别在于没有实际的
DoesNotExist
类型/实例,并且没有创建List<T>
-您只需获取Person
实例。