我遇到了使用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>
。有沒有人有任何經驗讓這個工作?他們能提供一些關於我做錯了什麼的指示嗎?
這回答我的問題比較簡單。不幸的是,我沒有直接訪問我的真實項目中的序列化程序 - 它被OpenRasta抽象出來。但是這應該讓我朝着正確的方向前進,謝謝。 – 2010-09-10 19:47:19