gpt4 book ai didi

c# - 使用带有 protobuf-net 异常的代理项序列化 List

转载 作者:太空狗 更新时间:2023-10-29 23:00:34 25 4
gpt4 key购买 nike

我正在使用 protobuf-net(版本 2.0.0.621)并且在序列化 List 类型时遇到问题,其中 T 是我自己的类(它包含什么并不重要)并且为 T 设置了代理项。

代理是这样设置的:

ProtoBuf.Meta.RuntimeTypeModel.Default.Add(typeof(MyClass), false).SetSurrogate(typeof(MyClassSurrogate));

我的类(class):

public class MyClass
{
public int Number { get; set; }
}

[ProtoContract]
MyClassSurrogate
{
[ProtoMember(1)]
public int Number { get; set; }
}

然后我创建一个 MyClass 实例类型的通用列表,用项目填充它并像这样序列化它:

ProtoBuf.Serializer.Serialize(stream, list);

问题发生在反序列化上,我在隐式运算符转换中的代理项中不断得到“null”:

static public implicit operator MyClassSurrogate(MyClass myClass)

然后 'myClass' 为空。

如果我删除代理项并使用 proto 属性装饰 MyClass,一切正常。

你能告诉我哪里做错了吗?

谢谢。

最佳答案

向隐式运算符转换添加空检查似乎可以解决问题,即:

public static implicit operator MyClassSurrogate(MyClass myClass)
{
return myClass != null ? new MyClassSurrogate { Number = myClass.Number } : null;
}

隐式运算符最初在反序列化时使用空值调用一次,结果似乎被忽略了。

MyClassSurrogate 的完整实现:​​

[ProtoContract]
public class MyClassSurrogate
{
[ProtoMember(1)]
public int Number { get; set; }

public static implicit operator MyClassSurrogate(MyClass myClass)
{
return
myClass != null
? new MyClassSurrogate { Number = myClass.Number }
: null;
}

public static implicit operator MyClass(MyClassSurrogate myClass)
{
return new MyClass { Number = myClass.Number };
}
}

完整序列化/反序列化示例:

var model = ProtoBuf.Meta.RuntimeTypeModel.Default;
model.Add(typeof(MyClassSurrogate), true);
model.Add(typeof(MyClass), false).SetSurrogate(typeof(MyClassSurrogate));
var stream = new System.IO.MemoryStream();
var list = new List<MyClass>();
for (int x = 0; x < 10; x++) list.Add(new MyClass { Number = x });
ProtoBuf.Serializer.Serialize(stream, list);
stream.Seek(0, SeekOrigin.Begin);
var xs = ProtoBuf.Serializer.Deserialize<List<MyClass>>(stream);
foreach (var x in xs) Debug.WriteLine(x.Number);

关于c# - 使用带有 protobuf-net 异常的代理项序列化 List<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14796296/

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