繁体   English   中英

Protobuf-net未序列化基类成员

[英]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;
    }
}

我们有两个问题:

  1. 在序列化期间,我们得到一个例外,即ScheduleTemplateViewModel的Castle DynamicProxy类型是意外的。 我们注意到在protobuf-net中有自定义代码来处理NHibernate和EntityFramework代理...但是没有Castle DynamicProxies。 我们通过在protobuf-net源代码中添加一个额外的case语句来检查Castle的IProxyTargetAccessor类型来解决此问题,但是如果有一种无需修改protobuf-net源代码的处理方式,那就太好了...

  2. ScheduleTemplateViewModel(即Comment)上的成员正确序列化了……但是基类成员却没有序列化。 我们已经在RuntimeTypeModel.Default上将InferTagFromNameDefault设置为true。

  1. 我可以补充一点; 您能告诉我该接口的全名(包括名称空间)吗?

  2. 从你给的例子,这些值应该序列,因为他们没有包括必要的数字字段数的信息。 既然你说的有些序列化,我会认为这是在复制/粘贴的疏忽。 如果没有更好的方法,Protobuf-net将尝试使用[DataMember(...)]Order=n信息。 但是,如果必须强调protobuf-net不能使用[KnownType(...)] ,则继承再次需要一些显式的数字字段编号信息。 通过[ProtoInclude(...)]最容易添加,但是也可以在运行时提供

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM