c# - 列表不会用 protobuf 序列化
问题描述
我正在尝试将 protobuf-net 用于即将进行的项目,但我很难弄清楚如何序列化一个类的列表。我创建了一个 dotnet fiddle 来测试一些基本场景并且一切正常,直到我创建一个简单的类并将该类的列表添加到另一个要序列化的类中。我创建了我的类的一个实例并打印它以显示所有值,然后序列化、反序列化并再次打印以显示所有数据都通过了该过程,但我的列表始终为空。有人知道这里发生了什么吗?
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Collections.Generic;
using ProtoBuf;
using ProtoBuf.Meta;
public class Program
{
public static void Main()
{
var item = new MyClass();
var listItem1 = new ComplexList();
listItem1.pubField = "first one";
var listItem2 = new ComplexList();
listItem2.pubField = "second one";
item.ComplexList.Add(listItem1);
item.ComplexList.Add(listItem2);
item.Print();
Console.WriteLine();
Console.WriteLine();
var serialized = ProtoObjectToByteArray(item);
var deserialized = ProtoByteArrayToObject<MyClass>(serialized);
deserialized.Print();
}
public static byte[] ProtoObjectToByteArray(object obj)
{
if(obj == null)
return null;
using (MemoryStream ms = new MemoryStream())
{
Serializer.Serialize(ms, obj);
return ms.ToArray();
}
}
public static T ProtoByteArrayToObject<T>(byte[] arrBytes)
{
if(arrBytes == null)
return default(T);
using (MemoryStream ms = new MemoryStream(arrBytes))
{
return Serializer.Deserialize<T>(ms);
}
}
}
[Serializable, ProtoContract]
public class ComplexList {
public string pubField;
public ComplexList(){}
}
[Serializable, ProtoContract]
public class MyClass {
public List<ComplexList> ComplexList { get; set; }
public MyClass(){
ComplexList = new List<ComplexList>();
}
public void Print(){
foreach(var x in ComplexList){
Console.WriteLine(x.pubField);
}
}
}
解决方案
Protobuf-net 希望你注释你的类型:
[Serializable, ProtoContract]
public class ComplexList {
[ProtoMember(1)]
public string pubField;
public ComplexList(){}
}
[Serializable, ProtoContract]
public class MyClass {
[ProtoMember(1)]
public List<ComplexList> ComplexList { get; set; }
public MyClass(){
ComplexList = new List<ComplexList>();
}
public void Print(){
foreach(var x in ComplexList){
Console.WriteLine(x.pubField);
}
}
}
protobuf 中的字段被赋予数字标识符,它需要一种可靠的方法来知道哪个字段是哪个数字。
请注意,您不需要[Serializable]
protobuf-net。
推荐阅读
- javascript - Materialize.css: Expand the first Collapsible div on Page load
- java - 取消无限循环
- ruby-on-rails - Google::Apis::RateLimitError: userRateLimitExceeded: 超出用户速率限制。用户请求率超过配置的项目配额
- hyperledger-fabric - 使用 Composer 在 HyperLedger Fabric 中基于标准的事件订阅
- ios - 如何在 iOS 中使用 googlemap 创建 customMarkerView
- node.js - EISDIR:对目录的非法操作,读取+Nodemailer图片附件
- c# - 如何使用 C# 解析 BsonDocument
- javascript - 如何在使用 Mongoose 时更新嵌套对象
- parameters - 看不懂参数
- android - Firebase 身份验证电话重新注册