Используйте protobuf-net для преобразования json в объект

Мне предоставили класс aC#, сгенерированный через protogen.

У меня есть ответ json, который я хочу преобразовать в объект (сопоставить с классом, сгенерированным из protogen).

Как мне этого добиться? Json, который у меня есть, похож на:

    Test {Id:"0000001" InsertDateTime:"4/12/2018 01:01:01" ModifyDateTime:"4/12/2018 01:05:10" ParentId:"0000001"
Sample{Id:"0000002" InsertDateTime:"4/12/2018 01:01:01" ModifyDateTime:"4/12/2018 01:05:10"}
}

Основным именем класса является "Test", и оно имеет int, строковые свойства, а также свойства типа "class".

Я хочу преобразовать этот Json в объект класса, сгенерированный "protogen".

1 ответ

Protobuf-net реализует только спецификацию двоичных протокольных буферов (ProtoBuf).

Неясно, подразумеваете ли вы под "json" "JSON общего назначения, ничего общего с ProtoBuf", или вы имеете в виду "формат JSON протокола буферов, добавленный около 3.0".

Если вы имеете в виду универсальный JSON: тогда обычно почти любой сериализатор JSON будет работать нормально - Json.NET является хорошим вариантом по умолчанию, но существуют другие сериализаторы JSON. Это связано с тем, что protobuf-net пытается работать с идиоматическими объектами.NET, что означает, что он очень хорошо работает с другими инструментами, работающими с идиоматическими объектами.NET.

Если вы имеете в виду JSON, специфичный для ProtoBuf, то я бы предложил использовать официальную библиотеку Google C# ProtoBuf, которая реализует это. У меня просто не было необходимости или времени добавлять поддержку для этого в protobuf-net, и на сегодняшний день добавление этого было для меня очень низким приоритетом - я просто не видел, чтобы кто-нибудь просил об этом от меня.


Если у вас есть общий JSON, но макет JSON отличается от вашей модели protobuf, то, честно говоря, я бы рекомендовал две модели DTO:

  • тот, который предназначен для работы с вашими данными JSON и выбранным вами сериализатором JSON (например, Json.NET)
  • тот, который предназначен для работы с вашими данными ProtoBuf и выбранным вами сериализатором ProtoBuf (таким как protobuf-net)

и просто сопоставьте два представления с помощью обычного кода C# (или любого другого инструмента автоматического сопоставления по вашему выбору).

Иногда вы можете бороться с библиотекой сериализатора, чтобы заставить ее работать с объектной моделью, которая не соответствует форме данных, но по моему опыту это плохое использование времени и приводит к хрупкому, глючному коду.

Другие вопросы по тегам