c# - 是否可以使用 Protocol Buffer 序列化 System.Object 对象列表

标签 c# serialization .net-4.5 protocol-buffers protobuf-net

我有一个各种数据类型(DateTime、int、decimal、string)的对象列表。

List<object> myObjects = new List<object>();
myObjects.Add(3);
myObjects.Add(3.9m);
myObjects.Add(DateTime.Now);
myObjects.Add("HELLO");

我能够使用 protobuf-net 序列化此列表,但反序列化总是抛出异常:“附加信息:类型不是预期的,并且无法推断出契约(Contract):System.Object”。

using (var ms = new MemoryStream())
{
    Serializer.Serialize(ms, list2);
    var bytes = ms.ToArray();
    ms.Position = 0;
    var clone = Serializer.Deserialize(typeof(List<object>), ms); //Throws exception
}

我没有任何明确的契约(Contract),我想这就是问题所在?但是,我确实知道序列化对象的预期类型是什么,但我该如何告诉 protobuf-net?

最佳答案

检查这些以了解为什么这是一种方法:

  1. The need for a parameterless constructor

  2. why dynamic instead of object wouldn't have worked

  3. 为什么 DynamicType=true wouldn't have worked

  4. the need for an abstract base class and concrete implementations , 由 protobuf-net 的创建者

  5. why no serializer for object

抽象基础

    [ProtoContract]
    [ProtoInclude (1, typeof(ObjectWrapper<int>))]
    [ProtoInclude(2, typeof(ObjectWrapper<decimal>))]
    [ProtoInclude(3, typeof(ObjectWrapper<DateTime>))]
    [ProtoInclude(4, typeof(ObjectWrapper<string>))]
    abstract class ObjectWrapper {
        protected ObjectWrapper() {}
        abstract public object ObjectValue { get; set; }
    }

实现

    [ProtoContract()]
    class ObjectWrapper<T> : ObjectWrapper
    {
        public ObjectWrapper(): base() { }
        public ObjectWrapper(T t) { this.Value = t; }

        [ProtoIgnore()]
        public override object ObjectValue
        {
            get { return Value; }
            set { Value = (T)value; }
        }

        [ProtoMember(1)]
        public T Value { get; set; }
    }

测试

        var myObjects = new List<ObjectWrapper>();
        myObjects.Add(new ObjectWrapper<int>(3));
        myObjects.Add(new ObjectWrapper<decimal>(3.9m));
        myObjects.Add(new ObjectWrapper<DateTime> (DateTime.Now));
        myObjects.Add(new ObjectWrapper<string> ("HELLO"));
        var clone = Serializer.DeepClone(myObjects);

关于c# - 是否可以使用 Protocol Buffer 序列化 System.Object 对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38905411/

相关文章:

c# - 为什么这个 Fluent NHibernate Configuration 仍然将所有级别记录到 log4net?

c++ - 编码、数据类型和打包的重复字段

.net - <decimal>.ToString ("P3") 在 Win7 和 Windows 10 上返回不同的结果

c# - 在 C# 和 Xaml 中以编程方式单击 Windows 8 按钮

debugging - 如何调试 EF5 在运行时生成的 SQL?

c# - MongoDB .net 驱动程序 - 获取 MongoDB 服务器版本

c# - 将 List<contacts> 插入表格

java - 将 JSON 从 Python 发送到 Java

c# - 通用工厂方法的统一类型注册

c++ - 序列化可变状态并通过网络异步发送它,几乎是零拷贝(Cap'n Proto + ZeroMQ)