protobuf和List – 如何序列化/反序列化?

我有一个List其中包含不同类型的对象,如整数,字符串和自定义类型。 所有自定义类型都是protobuf调整。 我现在要做的是使用protobuf.net序列化/反序列化此列表。 到目前为止,我怀疑我必须明确地声明每个类型,遗憾的是这些混合列表结构是不可能的。 因为二元形成器没有问题做这些事情我希望我错过了什么,你可以帮助我。 所以我的问题是如何处理protobuf.net中的对象。

(披露:我是protobuf-net的作者)

BinaryFormatter是一个基于元数据的序列化器; 即它发送有关序列化的每个对象的.NET类型信息。 protobuf-net是一个基于契约的序列化器( XmlSerializer / DataContractSerializer的二进制等价物,它也会拒绝这个)。

目前没有传输任意物体的机制,因为另一端无法知道你发送的是什么; 但是,如果您要发送一组已知不同对象类型,则可能有选项。 管道中还有工作允许运行时可扩展的模式(而不仅仅是在构建时修复的属性) – 但这远非完整。


这不是理想的,但它可以工作……当我完成支持运行时模式的工作时应该更容易:

 using System; using System.Collections.Generic; using ProtoBuf; [ProtoContract] [ProtoInclude(10, typeof(DataItem))] [ProtoInclude(11, typeof(DataItem))] [ProtoInclude(12, typeof(DataItem))] [ProtoInclude(13, typeof(DataItem))] abstract class DataItem { public static DataItem Create(T value) { return new DataItem(value); } public object Value { get { return ValueImpl; } set { ValueImpl = value; } } protected abstract object ValueImpl {get;set;} protected DataItem() { } } [ProtoContract] sealed class DataItem : DataItem { public DataItem() { } public DataItem(T value) { Value = value; } [ProtoMember(1)] public new T Value { get; set; } protected override object ValueImpl { get { return Value; } set { Value = (T)value; } } } [ProtoContract] public class Foo { [ProtoMember(1)] public string Bar { get; set; } public override string ToString() { return "Foo with Bar=" + Bar; } } static class Program { static void Main() { var items = new List(); items.Add(DataItem.Create(12345)); items.Add(DataItem.Create(DateTime.Today)); items.Add(DataItem.Create("abcde")); items.Add(DataItem.Create(new Foo { Bar = "Marc" })); items.Add(DataItem.Create(67890)); // serialize and deserialize var clone = Serializer.DeepClone(items); foreach (DataItem item in clone) { Console.WriteLine(item.Value); } } } 
 List list; ProtoBuf.Serializer.Deserialize>(filestream);