使用具有某些字段的派生类型的 protobuf-net 反序列化对象
Deserializing an object with protobuf-net with derived type for some field
有一些逻辑使用 protobuf-net 将 DataContainer<BaseClass>
类型的数据存储到某个存储库。可以说我需要创建新的 DerivedClass,因此 DataContainer<DerivedClass>
的所有新实例都将被正确序列化,但是出于向后兼容性的目的,我希望可以选择将一些以前保存的数据反序列化为 DerivedClass,而不更改存储库中的任何数据.
class Program
{
static void Main(string[] args)
{
var baseObject = new BaseClass()
{
Name = "some name"
};
using (var stream = new MemoryStream())
{
ProtoBuf.Serializer.Serialize(stream, new DataContainer<BaseClass>{ Data = baseObject, DataBase64 = "base class Base64"});
stream.Seek(0, SeekOrigin.Begin);
//System.InvalidCastException: 'Unable to cast object of type 'BaseClass' to type 'DerivedClass'.'
var result = ProtoBuf.Serializer.Deserialize<DataContainer<DerivedClass>>(stream);
}
}
}
public interface IDataInterface
{
}
[ProtoBuf.ProtoContract]
[ProtoInclude(1001, typeof(DerivedClass))]
public class BaseClass: IDataInterface
{
[ProtoBuf.ProtoMember(1)]
public string Name { get; set; }
}
[ProtoBuf.ProtoContract]
public class DerivedClass : BaseClass
{
[ProtoBuf.ProtoMember(1)]
public int Index { get; set; }
}
public interface IContainerInterface
{
IDataInterface Content { get; }
}
[ProtoContract]
public class DataContainer<T> : IContainerInterface where T: IDataInterface
{
[ProtoMember(1)]
public T Data { get; set; }
[ProtoMember(2)]
public string DataBase64 { get; set; }
public IDataInterface Content => this.Data;
}
有什么方法可以从序列化的 DataContainer<BaseClass>
中反序列化 DataContainer<DerivedClass>
吗?另一种方法是在反序列化 DataContainer<BaseClass>
后使用一些更高级别的转换器,这只会将其转换为 DataContainer<DerivedClass>
,但它涉及一些 属性-coping,我想尽量避免这种情况尽可能
如果您正在序列化的项目 * 是 DerivedClass
,那么我 期望 这已经可以工作了。但是,如果您需要反序列化只知道 BaseClass
的现有数据,那么您需要反序列化一个 DataContainer<BaseClass>
,然后测试发现 Data
是 实际上是 DerivedClass
.
有一些逻辑使用 protobuf-net 将 DataContainer<BaseClass>
类型的数据存储到某个存储库。可以说我需要创建新的 DerivedClass,因此 DataContainer<DerivedClass>
的所有新实例都将被正确序列化,但是出于向后兼容性的目的,我希望可以选择将一些以前保存的数据反序列化为 DerivedClass,而不更改存储库中的任何数据.
class Program
{
static void Main(string[] args)
{
var baseObject = new BaseClass()
{
Name = "some name"
};
using (var stream = new MemoryStream())
{
ProtoBuf.Serializer.Serialize(stream, new DataContainer<BaseClass>{ Data = baseObject, DataBase64 = "base class Base64"});
stream.Seek(0, SeekOrigin.Begin);
//System.InvalidCastException: 'Unable to cast object of type 'BaseClass' to type 'DerivedClass'.'
var result = ProtoBuf.Serializer.Deserialize<DataContainer<DerivedClass>>(stream);
}
}
}
public interface IDataInterface
{
}
[ProtoBuf.ProtoContract]
[ProtoInclude(1001, typeof(DerivedClass))]
public class BaseClass: IDataInterface
{
[ProtoBuf.ProtoMember(1)]
public string Name { get; set; }
}
[ProtoBuf.ProtoContract]
public class DerivedClass : BaseClass
{
[ProtoBuf.ProtoMember(1)]
public int Index { get; set; }
}
public interface IContainerInterface
{
IDataInterface Content { get; }
}
[ProtoContract]
public class DataContainer<T> : IContainerInterface where T: IDataInterface
{
[ProtoMember(1)]
public T Data { get; set; }
[ProtoMember(2)]
public string DataBase64 { get; set; }
public IDataInterface Content => this.Data;
}
有什么方法可以从序列化的 DataContainer<BaseClass>
中反序列化 DataContainer<DerivedClass>
吗?另一种方法是在反序列化 DataContainer<BaseClass>
后使用一些更高级别的转换器,这只会将其转换为 DataContainer<DerivedClass>
,但它涉及一些 属性-coping,我想尽量避免这种情况尽可能
如果您正在序列化的项目 * 是 DerivedClass
,那么我 期望 这已经可以工作了。但是,如果您需要反序列化只知道 BaseClass
的现有数据,那么您需要反序列化一个 DataContainer<BaseClass>
,然后测试发现 Data
是 实际上是 DerivedClass
.