2009-08-26 4 views
14

Попытка разобраться с google protobuf. Я нашел некоторую реализацию protobuf в C#, но у них, похоже, не хватает одной функции: возможность автоматически генерировать файлы .proto из существующего класса C#, украшенного атрибутами.Как сгенерировать файл .proto из класса C#, украшенного атрибутами?

Причина, по которой я хочу сделать это таким образом, вместо перехода от автоматически сгенерированных классов C# из файла .proto, потому что у меня уже есть классы C#, определенные в моем проекте, и я не хочу дублировать их, чтобы удовлетворить Protobuf.

Кто-нибудь сталкивался с таким сценарием?


Update

Это можно просто украсить C# класс и не использовать файл .proto использовать Protobuf?

ответ

21

Хорошие новости; то, что вы описали (имея существующие классы C#), является ожидаемым вариантом использования protobuf-net. Все материалы .proto («protogen», надстройка VS и т. Д.) Были добавлены как последумности. Ядро protobuf-net не знает о них и не заботится о них.

протокольные буферы определяют DSL (.proto, как вы упоминаете), который используется совместно между реализациями и используется (иногда) для генерации кода. Когда я впервые написал protobuf-net, аспект генерации кода не был моим самым большим беспокойством - просто разработчики .NET обычно были виноваты (включая меня), а не «контракт первым».

Как следствие, protobuf-net не нуждается .proto файлы для работы; присвоенного класса достаточно, чтобы однозначно сериализовать/десериализовать. Просто используйте Serializer.Serialize, .Merge и .Deserialize (и т.д.).

Это сказано; это делает включают некоторые очень слаборазвитых и экспериментальная поддержка для этого:

string proto = Serializer.GetProto<YourType>(); 

Это далеко не полный, но может работать для простых типов. Если у вас есть определенные случаи, когда он не работает, сообщите мне (добавьте комментарий или зарегистрируйте проблему). Однако; в большинстве случаев, люди, заинтересованные в .proto, напишут .proto сначала и работа оттуда.

Примеры рабочих украшенных типов показаны на project home page; это зависит только от того, используете ли вы атрибуты WCF, атрибуты xml или атрибуты protobuf-net (хотя последние обеспечивают больший контроль над некоторыми точками сериализации, такими как наследование и числовые макеты).

+0

Отлично, это соответствовало бы моим требованиям. Однако, еще одна вещь, Protobuf-Net реализует всю спецификацию Protobuf? –

+0

Pretty-much; Если честно, спецификация проводного формата не является огромной. Вы хотите объединиться с отдельной реализацией .proto? Он должен работать нормально, но если у вас есть * .proto (для другого конца), я бы рекомендовал создать DTO (из .proto) и подгонки к вашим типам. Он также становится креативным, позволяя protobuf-net поддерживать наследование (которое ** не ** входит в основную спецификацию .proto), но сделано таким образом, что позволяет полностью взаимодействовать с другими клиентами. –

+0

Я не собираюсь взаимодействовать с другой реализацией. Я буду использовать protobuf-net как эффективный механизм сериализации/десериализации целой иерархии объектов между двумя приложениями. –

4

Перед тарелочкам Марк работает здесь и получает огромные бонусы, позвольте мне отметить protobuf.net.

+3

На самом деле это был бы я ;-p –

+0

Да, я посмотрел проект, но, похоже, не могу найти документацию о том, как сгенерировать файлы .proto из украшенного класса C#. Или нужен ли файл .proto для использования protobuf? –

+0

Ну, я только помню, как Скит говорил об этом .... – Will