Подходящая кодировка типа по умолчанию не найдена. При сериализации с использованием protobuf

У меня ниже класс: -

[Serializable]
[DataContract(Name = "StateValueWrapper")]
public class StateValueWrapper
{
    [DataMember(Order = 1)]
    public Type StateValueType { get; set; }

    [DataMember(Order = 2)]
    public object WrappedObj { get; set; }
}

Я пытаюсь сериализовать объект вышеуказанного класса, используя protobuf.net. При сериализации появляется ошибка «Не найдено подходящей кодировки типа по умолчанию». пожалуйста, подскажите, что мне для этого нужно сделать? Ниже мой код для сериализации: -

            MemoryStream ms = new MemoryStream();
            var srariazeObj = new StateValueWrapper();
            srariazeObj.StateValueType = typeof(int);
            srariazeObj.WrappedObj = 5;
            ProtoBuf.Serializer.NonGeneric.Serialize(ms, srariazeObj);

person Vivek jain    schedule 02.02.2011    source источник


Ответы (2)


Type нельзя сериализовать через protobuf-net, как и object. Я понимаю, что вы пытаетесь сделать, и если честно, вы не можете знать типы заранее. Я подозреваю, что вам следует подумать о сериализации AssemblyQualifiedName типа (string) и byte[] для объекта (через MemoryStream). Я могу привести пример позже, если хотите (дайте мне знать).

Однако, если можно указать конечное потерянное количество типов, которые необходимо поддерживать (например, "string или int, Customer или Guid только"), более эффективный и удобный подход - опять же, я могу привести пример, если это ваш сценарий - дайте мне знать.

person Marc Gravell    schedule 02.02.2011
comment
Да, Марк, у меня есть конечный набор типов для сериализации с использованием protobuf. Было бы здорово, если бы вы поделились подходом, который вы сказали в последнем посте. - person Vivek jain; 03.02.2011
comment
@vivek - я нашел существующий очень похожий пример; здесь - person Marc Gravell; 03.02.2011

Теперь, что я сделал, я создал собственный поставщик сеансов и передал его объекту StateValueWrapper. В методе сериализации сначала я сериализую WrappedObj StateValueWrapper с помощью protobuf и назначаю его обратно WrappedObj, теперь двоичный сериализатор сериализует мой объект StateValueWrapper, который содержит информацию о типе и массив байтов. Во время десериализации первый двоичный сериализатор десериализует SessionStateItemCollection и возвращает StateValueWrapper с информацией о типе и массивом байтов, после чего я выполнил десериализацию (protobuf) WrappedObj, используя информацию о типе StateValueWrapper.

person Vivek jain    schedule 03.02.2011