我遇到了使用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>
。有没有人有这方面的工作经验?他们可以提供一些关于我做错的指示吗?
答案 0 :(得分:0)
您可以尝试将代理类型添加到已知类型列表中:
var serializer = new DataContractJsonSerializer(
typeof(List<SimpleViewModel>),
new[] { proxyModel.GetType() });