C# Protobuf映射非序列化问题

C# Protobuf映射非序列化问题,c#,dictionary,serialization,protocol-buffers,C#,Dictionary,Serialization,Protocol Buffers,考虑以下.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; } 对象book1

考虑以下.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;
}
对象
book1
已正确填充:

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

当我们取消序列化对象时,会出现问题:

“常规”字段(string、double、int)是未序列化的,但map(
Google.Protobuf.Collections.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);
var book1=newbook(){Name=“book1”};
book1.Persons.Add(“Person1”,newPersonInfo(){Name=“Person1”,Details=“Some Details”});
//系列化
var book1JsonStr=JsonConvert.serialized对象(book1);
//非工业化
var book2=JsonConvert.SerializeObject(book1JsonStr);

那是哪个JsonSerializer?这就是protobuf JSON API吗?或者像Newtonsoft这样的东西?Google protobuf实现包括(自以为是的)JSON支持,但老实说:大多数时候,如果您使用protobuf模式,您将使用protobuf二进制序列化,而不是JSON。如果它是一个第三方序列化库,那么它完全有可能省略了第三方序列化程序所需的一些API。序列化工具的设计者希望您使用该序列化,而不是其他人的序列化。@marcGravel我使用的是
System.Text.Json
中的序列化。令人惊讶的事实是序列化还可以。问题是从Json字符串重建对象。我正在重用protobuf编译器生成的类,以便在文件中存储一些缓存。最肯定的是,这不是一个好主意,最好使用proto生成的类来实现其原始目的:grpc的二进制序列化。protobuf在grpc之外也可以很好地用于文件等-事实上,几年来protobuf是开源的,使用得很好,但gRPC在内部是封闭的google@MarcGravell我遵循了你关于序列化库的提示。显然,
Newtonsoft.Json
System.Text.Json
更能解除
MapField
的序列化。我很高兴你找到了解决方案,但这不是我的建议。我建议使用protobuf:)
 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);