我目前正在尝试序列化/反序列化(版本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'。