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.Json
的 Protobuf.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);
考虑以下 .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.Json
的 Protobuf.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);