[英]Protobuf-net not serializing base class members
我们有以下类和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。
我可以补充一点; 您能告诉我该接口的全名(包括名称空间)吗?
从你给的例子,这些值都应该序列,因为他们没有包括必要的数字字段数的信息。 既然你说的有些不序列化,我会认为这是在复制/粘贴的疏忽。 如果没有更好的方法,Protobuf-net将尝试使用[DataMember(...)]
的Order=n
信息。 但是,如果必须强调protobuf-net不能使用[KnownType(...)]
,则继承再次需要一些显式的数字字段编号信息。 通过[ProtoInclude(...)]
最容易添加,但是也可以在运行时提供
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.