1

プロキシされたオブジェクト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 : データ コントラクト名「SimpleViewModelProxy: http://schemas.datacontract.org/2004/07/ Castle.Proxies」で「Castle.Proxies.SimpleViewModelProxy」と入力することは想定されていません。DataContractResolver の使用を検討するか、既知の型のリストに静的に認識されていない型を追加します。たとえば、KnownTypeAttribute 属性を使用するか、DataContractSerializer に渡される既知の型のリストにそれらを追加します。

単一の「SimpleViewModelProxy」オブジェクトまたは のいずれかをシリアル化できますList<SimpleViewModel>が、List<SimpleViewModelProxy>. これを機能させた経験のある人はいますか?彼らは私が間違っていることについていくつかの指針を提供できますか?

4

1 に答える 1

0

プロキシのタイプを既知のタイプのリストに追加してみてください。

var serializer = new DataContractJsonSerializer(
    typeof(List<SimpleViewModel>),
    new[] { proxyModel.GetType() });
于 2010-09-01T00:24:21.690 に答える