c# - Protobuf-net 不序列化基类成员

标签 c# .net wcf protobuf-net

我们有以下类和 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. 我可以补充一点;你能告诉我那个接口(interface)的全名(包括命名空间)吗?

  2. 从您给出的示例来看,这些值中没有应该序列化,因为它们都不包含必要的数字字段编号信息。既然你说一些序列化,我将假设这是复制/粘贴中的一个遗漏。如果没有更好的可用信息,Protobuf-net 将尝试使用来自 [DataMember(...)]Order=n 信息。但是,如果必须强调 protobuf-net 不能使用 [KnownType(...)],继承又需要一些明确的数字字段编号信息。这最容易通过 [ProtoInclude(...)] 添加,但也可以在运行时提供

关于c# - Protobuf-net 不序列化基类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15180116/

相关文章:

c# - 带参数的DataReader;

c# - MVVM属性怎么写?

c# - 数据库形状列表

c# - 正则表达式提取 html 正文

c# - 层和实体?

c# - 从另一个进程访问对象

C#按键; Label 中的显示键

c# - 红色边框不会随着 INotifyDataErrorInfo 消失

c# - 如何为多个服务创建事务 'Wrapper'?

c# - 流式 WCF 服务失败