序列化ProtoBuf-net中的字典<string,object>失败</string,object>

时间:2011-07-31 18:26:04

标签: c# serialization protobuf-net

(注意:字典,其中T是一些ProtoContract / ProtoMembered类工作正常。)这个问题只发生在我的类型对象上。

我试图序列化词典工作词典。

typeof(object)不起作用。应该是?我应该实现基于字符串的工作吗?

在这种情况下,对象将只是一个.net原语。

    [Test]
    public void De_SerializeObjectDictionary2()
    {
        var d = new Dictionary<string, object>();

        d.Add("abc", 12);

        var ms = new MemoryStream();

        var model = ProtoBuf.Meta.RuntimeTypeModel.Default;
        //model.AutoAddMissingTypes = true;
        //model.AutoCompile = true;
        //model.InferTagFromNameDefault = true;
        //model.Add(typeof (object), false);
        //model.Add(typeof(Int32), true);
        //model[typeof (object)].AddSubType(50, typeof (Int32));

        model.Serialize(ms, d);
        Serializer.Serialize<Dictionary<string,object>>(ms, d);
        // <--- No serializer defined for type: System.Object

        // or
        //model.Add(typeof (object), false);
        //Serializer.Serialize<Dictionary<string, object>>(ms, d);
        //<-- Unexpected sub-type: System.Int32
        ms.Position = 0;

        var d2 = Serializer.Deserialize<Dictionary<string, object>>(ms);
    }

我试图提前定义这些类型......但我认为它们默认由protobuf-net处理

        //model.Add(typeof (object), false);
        //model[typeof (object)].AddSubType(50, typeof (Int32));
        /*
        //model.Add(typeof(int), false);
        //model.Add(typeof(string), false);
        //model.Add(typeof(short), false);
        //model.Add(typeof(DateTime), false);
        //model.Add(typeof(long), false);
        //model.Add(typeof(bool), false);
        //model.Add(typeof(int[]), false);
        //model.Add(typeof(string[]), false);
        //model.Add(typeof(short[]), false);
        //model.Add(typeof(DateTime[]), false);
        //model.Add(typeof(long[]), false);
        //model.Add(typeof(bool[]), false);

        //model.Add(typeof(int?), false);
        //model.Add(typeof(short?), false);
        //model.Add(typeof(DateTime?), false);
        //model.Add(typeof(long?), false);
        //model.Add(typeof(bool?), false);
        //model.Add(typeof(int?[]), false);
        //model.Add(typeof(short?[]), false);
        //model.Add(typeof(DateTime?[]), false);
        //model.Add(typeof(long?[]), false);
        //model.Add(typeof(bool?[]), false);

        //model.Add(typeof(byte[]), false);
        //model.Add(typeof(byte), false);

1 个答案:

答案 0 :(得分:4)

已经提出了直接执行此操作的愿望,并且在我的列表中可以查看,但是:使用内置序列化(int等)处理类型作为继承的一部分有一些技术问题并不是很有趣。我的建议是使用具有通用具体实现的抽象基类,并在基类型上使用“include”属性来引用运行时的每个预期类型 - Foo<int>Foo<string>等.DynamicType这也是一个考虑因素,但没有一些小的调整,我认为这不会立即为字典工作。但它可以做到。