2013-03-02 92 views
2

我們有以下類和WCF服務(使用protobuf網序列化):protobuf網不序列化基類成員

[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
  1. 我可以補充一點;你能告訴我該接口的全名(包括命名空間)嗎?這些值的

  2. 從你給的例子,沒有應該序列,因爲他們沒有包括必要的數字字段數的信息。既然你說一些序列化,我會假設這是複製/粘貼中的一個遺漏。如果沒有更好的產品可用,Protobuf-net將嘗試使用來自[DataMember(...)]Order=n信息。但是,如果必須強調protobuf-net不能使用[KnownType(...)],並且繼承需要一些明確的數字字段號信息。這是通過[ProtoInclude(...)]最容易加入,但也可以在運行時

+0

我們InferTagFromNameDefault設置爲true提供的,所以這就是爲什麼我們不需要訂單= N的信息。這就是那個屬性所做的,對吧?有沒有在運行時動態/自動地將ProtoInclude添加到RuntimeTypeModel的方法?這是一個客戶端應用程序,因此我不希望在啓動時發生命中以提前將所有內容添加到RuntimeTypeModel中......也就是說,是否有可以觀看的鉤子或事件,如RuntimeTypeModel.Default.TypeAdded + = ...在哪裏我可以把代碼添加包括?我不喜歡把非BCL屬性放在我的所有類型上...... – Jeff 2013-03-04 14:06:57

+0

界面的全名在這裏http://internaltracker.googlecode.com/svn/trunk/Tracker/Castle.Core/DynamicProxy/IProxyTargetAccessor .cs – Jeff 2013-03-04 14:08:12

+1

@ JeffN825我的錯誤是沒有發現「InferTagFromNameDefault」。可以使用'RuntimeTypeModel.Default [baseType] .AddSubType(...)'操縱層次結構,但這是我可以提供的最好結果 – 2013-03-04 14:13:39