如何在使用c#protobuf-net进行序列化时将对象附加到文件中?

Rez*_*oan 1 c# serialization file protobuf-net

我得到了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);
    }
Run Code Online (Sandbox Code Playgroud)

但是假设我有两个Person实例,我想将其序列化为单个文件.我怎样才能做到这一点?

Mar*_*ell 5

protobuf,纯粹意义上说,除了文件的末尾之外没有任何"终结符"(这样就可以简单地通过连接blob来合并/组合对象).

但是,我们可以注入自己的标记,例如通过在每个对象前面加上后面数据的长度.

protobuf-net通过公开SerializeWithLengthPrefix方法来解决这个问题.有各种方法可以从中反序列化,但最简单的方法是DeserializeItems,依次为您提供一个流的对象序列(在迭代器中从流中懒洋洋地进行假脱机 - 因此它非常适合非常大的序列).

有关信息,所以你可以看到它是如何实现的:如果你使用PrefixStyle.Base128和肯定fieldNumber,那么在线看起来就像你有一个包装器对象一样:

[ProtoContract]
public class DoesNotExist {
    [ProtoMember({fieldNumber})]
    public List<Person> People {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

关键的区别在于没有实际的DoesNotExist类型/实例存在,并且没有List<T>创建 - 您只需获取Person实例.