Сериализовать список <объект> (где объекты поддерживаются примитивами) в 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, если это помогает.