是否可以使用协议缓冲区序列化 System.Object 对象列表

Posted

技术标签:

【中文标题】是否可以使用协议缓冲区序列化 System.Object 对象列表【英文标题】:Is it possible to serialize a list of System.Object objects using protocol buffers 【发布时间】: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?

【问题讨论】:

【参考方案1】:

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

    The need for a parameterless constructor

    why dynamic instead of object wouldn't have worked

    为什么DynamicType=truewouldn't have worked

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

    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);

【讨论】:

以上是关于是否可以使用协议缓冲区序列化 System.Object 对象列表的主要内容,如果未能解决你的问题,请参考以下文章

iOS 网络 - Moya 和协议缓冲区序列化

谷歌协议缓冲区是不是支持序列化前的大小计算?

Google 协议缓冲区可以在不同语言之间进行序列化/解析吗?

Google 协议缓冲区可以在不同语言之间进行序列化/解析吗?

提升序列化与谷歌协议缓冲区? [关闭]

协议缓冲区比序列化更好?