【问题标题】:Is it possible to serialize a list of System.Object objects using protocol buffers是否可以使用协议缓冲区序列化 System.Object 对象列表
【发布时间】:2016-08-11 20:19:19
【问题描述】:

我有一个各种数据类型(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 序列化此列表,但反序列化总是抛出异常:“附加信息:不期望类型,并且无法推断出任何合同: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
}

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

【问题讨论】:

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


    【解决方案1】:

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

    1. The need for a parameterless constructor

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

    3. 为什么DynamicType=truewouldn'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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 2012-03-19
      • 2011-05-03
      • 1970-01-01
      • 2011-09-11
      相关资源
      最近更新 更多