Сериализация словаря <string, object> в ProtoBuf-net завершается неудачно - PullRequest
7 голосов
/ 31 июля 2011

(ПРИМЕЧАНИЕ. Словарь, где T - это некоторый класс ProtoContract / ProtoMembered, работает нормально.) Эта проблема возникла только для меня с типом object.

Я пытался сериализовать словарь рабочего словаря.

typeof (объект) не работает.Должно ли это?Должен ли я реализовать работу на основе строк?

В этом сценарии объект всегда будет только примитивом .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 Ответ

4 голосов
/ 31 июля 2011

Желание сделать это напрямую уже было предложено и находится в моем списке, чтобы рассмотреть, но: обработка типов со встроенной сериализацией (int и т. Д.) Как часть наследования имеет некоторые технические проблемы, которые не очень интересны. Здесь я рекомендую использовать абстрактный базовый класс с общей конкретной реализацией и атрибут «include» базового типа для цитирования каждого из ожидаемых типов во время выполнения - Foo<int>, Foo<string> и т. Д. DynamicType также будет рассмотрение здесь, но без нескольких незначительных настроек я не думаю, что это работает сразу для словаря. Это может сделать, однако.

...