Protobuf- net десериализует строковое поле до c# guid - PullRequest
1 голос
/ 26 марта 2020

В упрощенном сценарии предположим, что у нас есть пользовательский тип c#, который содержит поле guid и соответствующий тип прото,

message HelloReply {
  string message = 1;
  string guid_id = 2; // this is defined GUID in corresponding c# type
  repeated string names = 3;
  map<string, double> prices = 4;
}

Когда я пытаюсь десериализовать этот прото в тип c# , Я получаю исключение, сообщающее «Неверный тип провода» и ссылку на объяснение , что мне не полезно. Есть ли обходной путь для этого или я что-то упускаю?

1 Ответ

0 голосов
/ 26 марта 2020

Protobuf- net имеет мнения о руководствах. Мнения, которые были подделаны в глубине времени, и о которых я сейчас сожалею, но которые трудно вернуть, не сломив людей. Если бы я писал это сегодня, оглядываясь назад, то да: он, вероятно, просто сериализовался бы как строка. Но: это не то, что он ожидает сегодня!

Честно говоря, я бы взломал его с помощью свойства тени. Таким образом, вместо

[ProtoMember(42)]
public Guid Foo {get;set;}

Вы можете использовать:

public Guid Foo {get;set;}
[ProtoMember(42)]
private string FooSerialized {
    get => Foo.ToString(); // your choice of formatting
    set => Foo = Guid.Parse(value);
}
...