ProtoBuf-Net error: No serializer defined for type of inner class
ProtoBuf-Net error: No serializer defined for type of inner class
当使用 protobuf-net 时,我有一个 class Data
装饰着 [ProtoContract]
属性,它定义了一个内部 class。该类型的成员也应该被序列化。
[ProtoContract]
public class Data {
[ProtoMember(1)]
public string Member { get; set; }
[ProtoMember(2)]
public NestedData Nested { get; set; }
public class NestedData
{
[ProtoMember(1)]
public string InnerMember { get; set; }
}
}
当我实例化此 class 并尝试使用 ProtoBuf.Serializer.Serialize(System:IO.Stream, Data)
对其进行序列化时,这会引发异常“System.InvalidOperationException:'No serializer defined for type: MinimalExample.Data+NestedData'”。我想我只是有一个盲点——我的错误在哪里?如果 protobuf-net 在一般情况下处理内部 classes 有问题,我会感到很惊讶。
我在 .net 5 上使用 protobuf-net 3.0.101。
您只需将 NestedData
注释为 [ProtoContract]
:
[ProtoContract]
public class Data
{
[ProtoMember(1)]
public string Member { get; set; }
[ProtoMember(2)]
public NestedData Nested { get; set; }
[ProtoContract]
public class NestedData
{
[ProtoMember(1)]
public string InnerMember { get; set; }
}
}
测试:
void Main()
{
var data = new Data
{
Member = "member",
Nested = new Data.NestedData
{
InnerMember = "inner"
}
};
using var mem = new MemoryStream();
ProtoBuf.Serializer.Serialize(mem, data);
mem.Position = 0;
var data2 = ProtoBuf.Serializer.Deserialize<Data>(mem);
}
当使用 protobuf-net 时,我有一个 class Data
装饰着 [ProtoContract]
属性,它定义了一个内部 class。该类型的成员也应该被序列化。
[ProtoContract]
public class Data {
[ProtoMember(1)]
public string Member { get; set; }
[ProtoMember(2)]
public NestedData Nested { get; set; }
public class NestedData
{
[ProtoMember(1)]
public string InnerMember { get; set; }
}
}
当我实例化此 class 并尝试使用 ProtoBuf.Serializer.Serialize(System:IO.Stream, Data)
对其进行序列化时,这会引发异常“System.InvalidOperationException:'No serializer defined for type: MinimalExample.Data+NestedData'”。我想我只是有一个盲点——我的错误在哪里?如果 protobuf-net 在一般情况下处理内部 classes 有问题,我会感到很惊讶。
我在 .net 5 上使用 protobuf-net 3.0.101。
您只需将 NestedData
注释为 [ProtoContract]
:
[ProtoContract]
public class Data
{
[ProtoMember(1)]
public string Member { get; set; }
[ProtoMember(2)]
public NestedData Nested { get; set; }
[ProtoContract]
public class NestedData
{
[ProtoMember(1)]
public string InnerMember { get; set; }
}
}
测试:
void Main()
{
var data = new Data
{
Member = "member",
Nested = new Data.NestedData
{
InnerMember = "inner"
}
};
using var mem = new MemoryStream();
ProtoBuf.Serializer.Serialize(mem, data);
mem.Position = 0;
var data2 = ProtoBuf.Serializer.Deserialize<Data>(mem);
}