2010-08-31 68 views
1

我遇到了使用System.Runtime.Serialization.Json.DataContractJsonSerializer序列化代理對象的List<T>的問題。它可以很好地處理單個代理對象,但是列表會讓它炸燬。事情是這樣的:無法使用DataContractJsonSerializer對DynamicProxy2生成的對象進行序列化<>>

using System.Collections.Generic; 
using System.Runtime.Serialization; 
using Castle.DynamicProxy; 
using System.IO; 
using NUnit.Framework; 

[DataContract] 
public class SimpleViewModel 
{ 
    [DataMember] 
    public virtual int ID { get; set; } 
} 
[Test] 
public void TestSerializeArray() 
{ 
    // Generates a proxy of type "SimpleViewModelProxy" 
    var proxyModel = (new ProxyGenerator()).CreateClassProxy<SimpleViewModel>(); 
    proxyModel.ID = 1; 
    //Put it into List<> (it can handle a single item without issue!) 
    var list = new List<SimpleViewModel> { proxyModel }; 
    var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(List<SimpleViewModel>)); 
    using (var stringWriter = new MemoryStream()) 
    { 
     serializer.WriteObject(stringWriter, list); //BOOM CRASH! 
    } 
} 

這樣做給了我以下異常:

System.Runtime.Serialization.SerializationException :類型 'Castle.Proxies.SimpleViewModelProxy' 數據合同名稱 「 SimpleViewModelProxy:http://schemas.datacontract.org/2004/07/ Castle.Proxies'不是預期的。 考慮使用DataContractResolver 或添加靜態 不知道已知類型列表中的任何類型 - 爲 例如,通過使用 KnownTypeAttribute屬性或者 將其添加到傳遞給 DataContractSerializer的已知 類型的列表。

我可以序列化一個「SimpleViewModelProxy」對象,或List<SimpleViewModel>,但不是List<SimpleViewModelProxy>。有沒有人有任何經驗讓這個工作?他們能提供一些關於我做錯了什麼的指示嗎?

回答

0

您可以嘗試代理的類型添加到已知類型的列表:

var serializer = new DataContractJsonSerializer(
    typeof(List<SimpleViewModel>), 
    new[] { proxyModel.GetType() }); 
+0

這回答我的問題比較簡單。不幸的是,我沒有直接訪問我的真實項目中的序列化程序 - 它被OpenRasta抽象出來。但是這應該讓我朝着正確的方向前進,謝謝。 – 2010-09-10 19:47:19

相關問題