Как я могу сериализовать анонимный тип с помощью DataContractJsonSerializer

Используя приведенный ниже код, как я могу использовать DataContractJsonSerializer для преобразования результирующего списка в JSON?

ETA: Я видел несколько методов расширения для общих объектов JSON-ize, но я не уверен, какой тип использовать, поскольку это анонимный тип.

<Product> products = GetProductList();

var orderGroups =
 from p in products
 group p by p.Category into g
 select new { Category = g.Key, Products = g };

Спасибо!


person Jon    schedule 27.06.2011    source источник


Ответы (2)


Вы не можете использовать сериализатор контрактов данных для выполнения этой сериализации, потому что анонимный тип не определяет никаких контрактов.

DataContractSerializers используют атрибуты [DataContract] и [DataMember], чтобы решить, какие свойства следует сериализовать. Однако, поскольку анонимные типы создаются компилятором, они не могут получать атрибуты.

[DataContract]
class Data
{
    [DataMember]
    public string Category{get;set;}
    [...]
}

На самом деле, я считаю, что вы делаете что-то не так, если ваши интерфейсы между клиентом и сервером определены через анонимные типы.

Вы, конечно, можете использовать другой сериализатор для выполнения этой задачи, но я не знаю ни одной рекурсивной сериализации каких-либо общедоступных свойств без каких-либо аннотаций. ;)

РЕДАКТИРОВАТЬ: На самом деле я точно знаю, что вы можете использовать для сериализации произвольных (и, следовательно, анонимных) классов в json. Используйте чудесную библиотеку Json.NET.

person Eilistraee    schedule 27.06.2011

код, который я здесь недавно опубликовал, представляет собой метод расширения, который сериализует все что угодно в json http://pastebin.com/cUX82cJC

person harryovers    schedule 27.06.2011
comment
Что я могу передать как тип, если это анонимный тип? - person Jon; 27.06.2011
comment
вам не нужно сериализовать. ты бы просто сделал string jsonData = orderGroups.JsonSerialise(); - person harryovers; 27.06.2011
comment
Простите меня, если я не понимаю, как работает DataContractJsonSerializer, но будет ли это работать с анонимным типом, поскольку у него не будет атрибутов DataContract и DataMember. - person Ben Robinson; 27.06.2011
comment
это может быть анонимно, но вы должны быть в состоянии сказать, какого типа будет ваша реализация, и поэтому вы можете пойти и добавить любые атрибуты DataContract и DataMember - person harryovers; 27.06.2011
comment
Если тип анонимный, вы не можете получить доступ к сгенерированному типу, поскольку он генерируется компилятором. (И не видно до компиляции) - person Eilistraee; 28.06.2011
comment
класс сериализации должен знать тип только во время выполнения, поэтому все будет в порядке - person harryovers; 28.06.2011