我们有以下类和 WCF 服务(使用 protobuf-net 进行序列化):
[DataContract]
[KnownType(typeof(NamedViewModel))]
public class NamedViewModel<TKey> : IViewModel
{
[DataMember]
public virtual TKey Id { get; set; }
[DataMember]
public virtual string Name { get; set; }
}
[DataContract]
[KnownType(typeof(ScheduleTemplateViewModel))]
public class NamedViewModel : NamedViewModel<int>
{
}
[DataContract]
public class ScheduleTemplateViewModel : NamedViewModel
{
[DataMember]
public string Comment { get; set; }
}
[DataContract]
public class Container
{
[DataMember]
public IEnumerable<ScheduleTemplateViewModel> Templates { get; set; }
}
[ServiceContract]
public interface IService
{
[OperationContract]
Container Get();
}
public class Service : IService
{
public IEnumerable<Container> Get()
{
return new Container { Templates = Enumerable.Range(1, 10)
.Select(i => CreateTemplate()).ToArray() };
}
private void ScheduleTemplateViewModel CreateTemplate()
{
var instance = WindsorContainer.Resolve<ScheduleTemplateViewModel>();
// populate instance
return instance;
}
}
我们有两个问题:
我们在序列化期间遇到异常,ScheduleTemplateViewModel 的 CaSTLe DynamicProxy 类型是意外的。我们注意到 protobuf-net 中有自定义代码来处理 NHibernate 和 EntityFramework 代理……但不是 CaSTLe DynamicProxies。我们通过在 protobuf-net 源代码中添加一个额外的 case 语句来检查 CaSTLe 的 IProxyTargetAccessor 类型来解决这个问题......但是如果有一种方法可以在不修改 protobuf-net 源代码的情况下处理这个问题......
ScheduleTemplateViewModel 的成员(即 Comment)被正确序列化...但基类成员没有。我们已经将 RuntimeTypeModel.Default 上的 InferTagFromNameDefault 设置为 true。
最佳答案
我可以补充一点;你能告诉我那个接口(interface)的全名(包括命名空间)吗?
从您给出的示例来看,这些值中没有应该序列化,因为它们都不包含必要的数字字段编号信息。既然你说一些做序列化,我将假设这是复制/粘贴中的一个遗漏。如果没有更好的可用信息,Protobuf-net 将尝试使用来自
[DataMember(...)]
的Order=n
信息。但是,如果必须强调 protobuf-net 不能使用[KnownType(...)]
,继承又需要一些明确的数字字段编号信息。这最容易通过[ProtoInclude(...)]
添加,但也可以在运行时提供
关于c# - Protobuf-net 不序列化基类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15180116/