C# Protobuf映射非序列化问题
考虑以下.proto定义: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
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);