DataContractJsonSerializerとDynamicProxy2が生成したオブジェクトの一覧を<>シリアル化できません
-
26-09-2019 - |
質問
私は、プロキシオブジェクトのSystem.Runtime.Serialization.Json.DataContractJsonSerializer
をシリアライズするList<T>
を使用して問題に実行していますよ。これは、単一のプロキシになるオブジェクトで罰金を動作しますが、リストはそれを爆破ます。このような何かます:
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>
のいずれかをシリアル化することができますよ。誰がどんな経験を仕事にこれを取得がありましたか?彼らは私が間違ってやっているものにいくつかのポインタを提供することができますか?
解決
あなたは知られているタイプのリストに、プロキシの種類を追加しようとすることができます:
var serializer = new DataContractJsonSerializer(
typeof(List<SimpleViewModel>),
new[] { proxyModel.GetType() });