Список сериализации <object>(где объекты поддерживаются примитивами) в Protobuf.NET? - PullRequest
12 голосов
/ 22 сентября 2011

Как мне сериализовать такой объект с помощью protobuf-net:

public class MyObject{
   public string Key {get; set;}
   public List<Object> Values {get; set;}
}

Когда я пытаюсь сериализовать это с помощью TypeModel, protobuf-net выдает ошибку, заявляющую, что он не знает, как сериализовать System.Object. Теперь я знаю, что значения всегда будут содержать только примитивы (int, string, float, DateTime и т. Д.). Итак, как мне сообщить об этом protobuf-net?

Ответы [ 2 ]

9 голосов
/ 23 сентября 2011

Это не совсем выполнимо в чистом ProtoBuf, в любом смысле.ProtoBuf строго типизирован, но не содержит информации о типе в сообщении;Информация о типе всегда указывается извне.Таким образом, есть два «хороших» решения;То есть решения, которые было бы легко интерпретировать с помощью реализации protobuf, отличной от Protobuf-net (о которой вы можете заботиться, а может и не заботиться, но, кажется, что это возможно).* где PrimitiveType содержит необязательные поля, соответствующие всем примерно 12 типам примитивов (в зависимости от вашего определения «Тип примитива».), и вы обеспечиваете заполнение только одного из них в каждом экземпляре.1007 * 2: заменить List<object> комбинацией List<int>, List<double>, List<string> и т. Д.

0 голосов
/ 23 сентября 2011

См. В Protobuf-net, как я могу передать массив объектов типа с объектами различных типов внутри, заранее зная набор потенциальных типов .

Согласно посту Марка (у автора Protobuf.NET) object проблематично.Хотя я не могу найти его прямо сейчас, я отчетливо помню, как видел в исходном тексте проверку для object, которая выдает исключение из-за попыток напрямую сериализовать свойства объекта.

Чтобы обойти это, вам следует использоватьопределенный класс для сериализации и не использовать object напрямую.Вы можете использовать IProtoSerializer для реализации пользовательской сериализации / десериализации.Protobuf также будет поддерживать интерфейсы ISerializable и IXmlSerializable, если это поможет.

...