gpt4 book ai didi

c# - 列表不会用 protobuf 序列化

转载 作者:行者123 更新时间:2023-11-30 21:32:52 26 4
gpt4 key购买 nike

我正在为一个即将到来的项目尝试使用 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);
}
}
}

根据要求更新 https://dotnetfiddle.net/vnfMWh

最佳答案

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 中的字段被赋予数字标识符,它需要一种可靠的方式来了解哪个字段是哪个数字。

请注意,对于 protobuf-net,您不需要 [Serializable]

关于c# - 列表不会用 protobuf 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51959183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com