具有层次结构的对象数组的Protobuf-Net序列化

时间:2014-02-28 18:06:12

标签: c# arrays serialization protobuf-net

我目前正在尝试序列化/反序列化(版本2.0.0.668)一个对象数组,其中每个对象都是一个类型。为简单起见,层次结构如下:

[ProtoContract]
[ProtoInclude(1, typeof (DeviceDescriptor1))]
[ProtoInclude(2, typeof (DeviceDescriptor1))]
public interface IDeviceDescriptor
{
}

[ProtoContract]
public sealed class DeviceDescriptor1
    : IDeviceDescriptor
{
    [ProtoMember(3)]
    public int Foo { get; set; }
}

[ProtoContract]
public sealed class DeviceDescriptor2
    : IDeviceDescriptor
{
    [ProtoMember(4)]
    public int Bar { get; set; }
}

以下测试代码首先序列化一个数组,然后再次反序列化:

var devices = new IDeviceDescriptor[]
{
    new DeviceDescriptor1{Foo = 1},
    new DeviceDescriptor2{Bar=42},
};

using (var stream = new MemoryStream())
{
    Serializer.Serialize(stream, devices);
    stream.Position = 0;
    var actualDevices = Serializer.Deserialize<IDeviceDescriptor[]>(stream);
}

然而,在反序列化时,会抛出ProtoException:一旦为ProtoBuf.DeviceDescriptor1(ProtoBuf.IDeviceDescriptor)生成了一个序列化程序,就无法更改该类型

我偶然发现了一个类似性质的旧问题(In Protobuf-net how can I pass an array of type object with objects of different types inside, knowing the set of potential types in advance),但我不确定这个问题是否仍适用 - 近4年后。

我不确定我在这里做错了什么。这种情况不受支持吗?如果是这样,我有什么选择来解决这个特殊问题?

感谢任何帮助:)

修改

这是我提出的这个特殊问题的解决方法:我不是序列化一个抽象类型数组,而是序列化一个泛型类型'ProtobufFrame'(带有一个T类型的字段),在这个特殊情况下最终会被'ProtobufFrame'。

0 个答案:

没有答案