Невозможно сериализовать список <> объектов, созданных DynamicProxy2, с помощью DataContractJsonSerializer - PullRequest
1 голос
/ 01 сентября 2010

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

1 Ответ

0 голосов
/ 01 сентября 2010

Вы можете попытаться добавить тип прокси в список известных типов:

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