Protobuf 映射反序列化问题

Protobuf map unserialization issue

考虑以下 .proto 定义:

syntax = "proto3";
option csharp_namespace = "Test";

message Book
{
    string name = 1;
    map<string, PersonInfo> persons = 2;
}

message PersonInfo
{
    string name = 1;
    string details = 2;
}

我想将 Book 的一个实例序列化为一个文件,然后反序列化它:

 var book1 = new Book() { Name = "Book1" };
 book1.Persons.Add("Person1", new PersonInfo() { Name = "Person1", Details = "Some details" });

 //serialization
 var book1JsonStr = JsonSerializer.Serialize(book1);

 //unserialization
 var book2 = JsonSerializer.Deserialize<Book>(book1JsonStr);

对象 book1 已正确填充:

并且序列化后的字符串也是正确的:

当我们反序列化对象时出现问题:

“常规”字段(字符串、双精度、整数)未序列化,但映射 (Google.Protobuf.Collections.MapField<TKey, TValue>) 未序列化。为什么会这样?这是一个错误吗?

如何反序列化 MapField

使用 Newtonsoft.Json 而不是 System.Text.Json 解决了这个问题。

 var book1 = new Book() { Name = "Book1" };
 book1.Persons.Add("Person1", new PersonInfo() { Name = "Person1", Details = "Some details" });

 //serialization
 var book1JsonStr = JsonConvert.SerializeObject(book1);

 //unserialization
 var book2 = JsonConvert.SerializeObject<Book>(book1JsonStr);

您可以使用 System.Text.JsonProtobuf.System.Text.Json 扩展来解决您的问题。

var book1 = new Book() { Name = "Book1" };
book1.Persons.Add("Person1", new PersonInfo() { Name = "Person1", Details = "Some details" });

//serialization
var jsonSerializerOptions = new JsonSerializerOptions();
jsonSerializerOptions.AddProtobufSupport();
var book1JsonStr = JsonSerializer.Serialize(book1, jsonSerializerOptions);

//deserialization
var book2 = JsonSerializer.Deserialize<Book>(book1JsonStr, jsonSerializerOptions);