Я сталкиваюсь с проблемой использования 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>
. Кто-нибудь имел опыт заставить это работать? Могут ли они дать некоторые указания на то, что я делаю неправильно?