无法序列化列表<> DataInteractJsonSerializer创建DynamicProxy2的对象

时间:2010-08-31 20:21:51

标签: c# datacontractserializer castle-dynamicproxy

我遇到了使用System.Runtime.Serialization.Json.DataContractJsonSerializer序列化List<T>代理对象的问题。单个代理对象可以正常工作,但List会让它爆炸。像这样:

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   或添加静态未知的任何类型   到已知类型列表 - for   例如,通过使用   KnownTypeAttribute属性或   将它们添加到已知的列表中   传递给的类型   DataContractSerializer的。

我能够序列化单个“SimpleViewModelProxy”对象或List<SimpleViewModel>,但不能序列化List<SimpleViewModelProxy>。有没有人有这方面的工作经验?他们可以提供一些关于我做错的指示吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试将代理类型添加到已知类型列表中:

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