序列化字典<字符串,对象>在ProtoBuf-net失败

本文关键字:ProtoBuf-net 失败 对象 字典 字符串 序列化 | 更新日期: 2023-09-27 18:04:00

(注意:字典中T是一些ProtoContract/protommemberclass工作良好。)这个问题只发生在我的类型对象。

我正在尝试序列化字典工作的字典。

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

序列化字典<字符串,对象>在ProtoBuf-net失败

直接这样做的愿望已经被提出,并且在我的列表中,但是:将具有内置序列化的类型(int等)作为继承的一部分有一些技术问题,这些问题不是很有趣。我的建议是使用一个抽象的基类和通用的具体实现,并在基类型上添加一个"include"属性,以在运行时引用每个预期的类型——Foo<int>, Foo<string>等。DynamicType在这里也是一个考虑因素,但如果没有一些小的调整,我认为它不能立即用于dictionary。