是否可以使用协议缓冲区序列化System.Object对象的列表 [英] Is it possible to serialize a list of System.Object objects using protocol buffers

查看:72
本文介绍了是否可以使用协议缓冲区序列化System.Object对象的列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有各种数据类型(DateTime,int,十进制,字符串)的对象列表。

I have a list of objects of various data types (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。

I was able to serialize this list using protobuf-net, but deserialization always throws the exception: "Additional information: Type is not expected, and no contract can be inferred: 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?

I don't have any explicit contract, I suppose that is the problem? However, I do know what are the expected types of serialized objects, but how do I tell to protobuf-net?

推荐答案

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

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


  1. 需要无参数构造函数

为什么动态而不是对象不起作用

为什么 DynamicType = true 无效

需要抽象基类和具体实现 ,由protobuf-net的创建者

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

为什么没有序列号zer 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对象的列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆