Сериализация разных элементов для XML и JSON

#c# #.net #json #serialization #datacontractserializer

#c# #.net #json #сериализация #datacontractserializer

Вопрос:

У меня есть пара классов, которые я сериализую в XML с помощью DataContract / DataMember атрибутов и DataContractSerializer . Теперь я хотел бы использовать те же классы для сериализации в JSON для вызовов ajax от клиента. Однако элементы, которые я хочу сериализовать в JSON, немного отличаются от тех, которые я хочу сериализовать в XML. Есть ли способ (с атрибутами) провести различие между этими двумя?

Кстати, я использую DataContractSerializer в отличие от XmlSerializer , потому что мне нужно сериализовать закрытые элементы, поэтому переключение на XmlSerializer не вариант.

Комментарии:

1. Если вы хотите предоставить разные элементы в двух разных контекстах, то по определению у вас есть два разных контракта с данными.

2. Это правда, поэтому, я думаю, вопрос в том, могу ли я определить два разных контракта данных в одном классе?

Ответ №1:

Для сериализации json я использую:

 System.Web.Script.Serialization.JavaScriptSerializer
  

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

http://msdn.microsoft.com/en-us/library/system.web.script.serialization.scriptignoreattribute.aspx

Редактировать:

Просто заметил, что есть еще один вариант, с которым вы могли бы быть более знакомы при работе с datacontracts:

 System.Runtime.Serialization.Json.DataContractJsonSerializer
  

Ссылается:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.aspx

http://msdn.microsoft.com/en-us/library/bb412179.aspx

Комментарии:

1. В основном мне нужно будет исключать / игнорировать элементы для сериализации XML. Возможно ли это также?

2. Вы можете игнорировать общедоступные свойства класса с атрибутами, просто связавшись с DataContractSerializer. Частные элементы могут быть проблемой. Но этот сериализатор не будет выполнять XML-сериализацию. Вам нужно было бы использовать DataContractSerializer или XmlSerializer, как вы упомянули. Проверьте ссылку, в которой приведен пример атрибута ScriptIgnoreAttribute.