Is it possible to serialize a list of System.Object objects using protocol buffers

雨燕双飞 提交于 2019-12-06 12:49:01
andrei.ciprian

Check these to see why this is a way to go:

  1. The need for a parameterless constructor

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

  3. why DynamicType=true wouldn't have worked

  4. the need for an abstract base class and concrete implementations, by the creator of protobuf-net

  5. why no serializer for object

Abstract base

    [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; }
    }

Implementation

    [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; }
    }

Test

        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);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!