2014-09-21 4 views
3

У меня есть класс, который хранит и обрабатывает некоторые объекты. В зависимости от количества входов я не могу хранить объекты в памяти, поэтому я пытаюсь выполнить сериализацию своих объектов, которые будут записываться на жесткий диск с использованием буферов протоколов. Я использую C# и protobuf-csharp-port. Я знаю protobuf-net как альтернативный порт; до сих пор я работал с первым вариантом, но я открыт для изменений, если это необходимо на основе моих потребностей.имитировать генераторы с протокольным буфером

Класс сериализовать в это упрощенная форма выглядит следующим образом:

class Entity<T> where T: IComparable<T> 
{ 
    int id; 
    T metaData; 
} 

Так во время компиляции у меня нет подсказки о metaData. Googling Я заметил, что расширения - это правильный путь для следования (как предложено на google's page и this question); поэтому я определяю файл Entity.proto для класса Entity следующим образом:

message Entity 
{ 
    required int32 id = 1 [default = 0]; 
    extensions 2 to max; 
} 

, и я хотел бы пользователю предоставить свой собственный .proto файл T без необходимости доступа или повторной компиляции Entity.proto. В этой связи у меня есть вопросы:

  1. Нужно ли мне менять Entity.proto?
  2. Что должно быть T.proto?
  3. Как я могу получить T в моем коде C#?

ответ

3

С этой схемой, все расширения будут ребенка значения (не подклассов) на необщего Entity. Это не похоже на дженерики, но в конечном итоге хранение (сериализация) часто отличается от реализации (Entity<T> и т. Д.). Если вы можете вручную установить между ними: отлично. Но это не то, что предоставит библиотека, AFAIK.

Для полноты в Protobuf внутрисетевые условиях: это прекрасно с Entity<T> - это, по существу рассматривает каждый (Entity<Foo>, Entity<Bar> и т.д.), чтобы быть полностью отдельные сообщения. Protobuf-net не очень мотивирован схемами .proto (хотя для полноты предоставлен инструмент кода-генерации) - он в основном использует метаданные времени выполнения.

+0

Пожалуйста, исправьте меня, если я ошибаюсь: protobuf-net поддерживает generics, который затем я могу скомпилировать мою библиотеку с 'Entity ' и это serializer (1). При использовании библиотеки вместе с пользователем 'T' также будет предоставлен его сериализатор (2). В конечном итоге экземпляр «Entity » будет сериализован с использованием (1) и (2). – Hamed

+1

@hamed чаще всего при использовании protobuf-net, вы вообще не распространяете сериализатор: библиотека будет беспокоиться об этом, когда это необходимо. Главные времена, когда вы распространяете сериализатор, для AOT-устройств –

+0

может быть слишком много смешивания с ООП, но я полностью смущен. 'Entity' не знает' T', поэтому он не может его сериализовать. С другой стороны, 'T' не знает структуру данных Entity, поэтому ни один из них не может обеспечить сериализацию. Тогда мне интересно, как «Entity » сериализуется? – Hamed

Смежные вопросы