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);
}