Сериализовать список <объект> (где объекты поддерживаются примитивами) в Protobuf.NET?
Как я сериализую объект, подобный этому, с 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?
Ответы
Ответ 1
В чистом ProtoBuf это не реально. ProtoBuf строго типизирован, но не содержит информацию о типе в сообщении; информация типа всегда указана снаружи. Таким образом, существует два "хороших" решения; То есть, решения, которые легко интерпретировать с помощью реализации protobuf, отличной от Protobuf-net (что вам может или не нужно, но marc обязательно кажется).
1: Замените List<object>
на List<PrimitiveType>
, где PrimitiveType
содержит необязательные поля, соответствующие всем 12-ти или более примитивным типам (в зависимости от вашего определения "примитивный тип".), и вы обеспечиваете только один из они заполняются в каждом экземпляре.
2: Замените List<object>
комбинацией List<int>
, List<double>
, List<string>
и т.д.
Ответ 2
См. В Protobuf-net, как я могу передать массив объектов типа с объектами разных типов внутри, зная заранее набор потенциальных типов.
Согласно сообщению Marc (автор Protobuf.NET) object
является проблематичным. Хотя я не могу найти его прямо сейчас, я отчетливо помню, как проверил object
в источнике, чтобы исключить исключение из попыток сериализации свойств объекта напрямую.
Чтобы обойти это, вы должны использовать более специфический класс для сериализации и не использовать object
напрямую. Вы можете использовать IProtoSerializer
для реализации пользовательской сериализации/десериализации. Protobuf также поддерживает интерфейсы ISerializable
и IXmlSerializable
, если это помогает.