Yak*_*ani 5 c# null protocol-buffers protobuf-net deserialization
我正在使用protobuf-net(版本2.0.0.621)并且在序列化List类型时遇到问题,其中T是我自己的类(它包含什么并不重要)并且为T设置了代理.
代理人设置如下:
ProtoBuf.Meta.RuntimeTypeModel.Default.Add(typeof(MyClass), false).SetSurrogate(typeof(MyClassSurrogate));
Run Code Online (Sandbox Code Playgroud)
我的课:
public class MyClass
{
public int Number { get; set; }
}
[ProtoContract]
MyClassSurrogate
{
[ProtoMember(1)]
public int Number { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我创建一个MyClass类型的通用列表,用项填充它并像这样序列化它:
ProtoBuf.Serializer.Serialize(stream, list);
Run Code Online (Sandbox Code Playgroud)
在反序列化时出现问题,我在隐式运算符转换中的代理中不断获得"null":
static public implicit operator MyClassSurrogate(MyClass myClass)
Run Code Online (Sandbox Code Playgroud)
然后'myClass'为空.
如果我删除代理并用proto属性装饰MyClass,一切正常.
你能告诉我我做错了什么吗?
谢谢.
向隐式运算符转换添加空检查似乎可以解决问题,即:
public static implicit operator MyClassSurrogate(MyClass myClass)
{
return myClass != null ? new MyClassSurrogate { Number = myClass.Number } : null;
}
Run Code Online (Sandbox Code Playgroud)
隐式运算符最初在反序列化时调用一次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 };
}
}
Run Code Online (Sandbox Code Playgroud)
完整序列化/反序列化示例:
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);
Run Code Online (Sandbox Code Playgroud)