我們有以下類和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;
}
}
我們有兩個問題:
我們得到的在序列化期間,用於ScheduleTemplateViewModel的Castle DynamicProxy類型出現意外的異常。我們注意到在protobuf-net中有自定義代碼來處理NHibernate和EntityFramework代理...但不是Castle DynamicProxies。我們通過在protobuf-net源代碼中添加一個額外的case語句來檢查Castle的IProxyTargetAccessor類型,但是如果有一種處理方法不需要修改protobuf-net源代碼,這將會很不錯。
ScheduleTemplateViewModel(即Comment)上的成員序列化正確...但基類成員不是。我們已經在RuntimeTypeModel.Default上將InferTagFromNameDefault設置爲true。
我們InferTagFromNameDefault設置爲true提供的,所以這就是爲什麼我們不需要訂單= N的信息。這就是那個屬性所做的,對吧?有沒有在運行時動態/自動地將ProtoInclude添加到RuntimeTypeModel的方法?這是一個客戶端應用程序,因此我不希望在啓動時發生命中以提前將所有內容添加到RuntimeTypeModel中......也就是說,是否有可以觀看的鉤子或事件,如RuntimeTypeModel.Default.TypeAdded + = ...在哪裏我可以把代碼添加包括?我不喜歡把非BCL屬性放在我的所有類型上...... – Jeff 2013-03-04 14:06:57
界面的全名在這裏http://internaltracker.googlecode.com/svn/trunk/Tracker/Castle.Core/DynamicProxy/IProxyTargetAccessor .cs – Jeff 2013-03-04 14:08:12
@ JeffN825我的錯誤是沒有發現「InferTagFromNameDefault」。可以使用'RuntimeTypeModel.Default [baseType] .AddSubType(...)'操縱層次結構,但這是我可以提供的最好結果 – 2013-03-04 14:13:39