我们有以下类和 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 上的成员(即评论)被正确序列化......但基类成员不是。我们已经在 RuntimeTypeModel.Default 上将 InferTagFromNameDefault 设置为 true。