2

我得到了将对象序列化为文件的 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 实例。我怎样才能做到这一点?

4

1 回答 1

6

protobuf,在纯粹意义上,除了文件末尾之外没有任何“终止符”(这样可以简单地通过连接 blob 来合并/组合对象)。

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

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

有关信息,您可以查看它是如何实现的:如果您使用PrefixStyle.Base128and 一个 positive fieldNumber,那么在网络上这看起来就像您有一个包装器对象一样:

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

主要区别在于不存在实际DoesNotExist类型/实例,并且没有List<T>创建 - 您只需获取Person实例。

于 2013-03-07T07:53:32.507 回答