Когда я сериализую следующее:
[Serializable]
public class Error
{
public string Status { get; set; }
public string Message { get; set; }
public string ErrorReferenceCode { get; set; }
public List<FriendlyError> Errors { get; set; }
}
Получаю этот отвратительный беспорядок:
<ErrorRootOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Printmee.Api">
<_x003C_Errors_x003E_k__BackingField>
An exception has occurred. Please contact printmee support
</_x003C_Errors_x003E_k__BackingField>
<_x003C_LookupCode_x003E_k__BackingField>988232ec-6bc9-48f3-8116-7ff7c71302dd</_x003C_LookupCode_x003E_k__BackingField>
</ErrorRootOfstring>
Что дает? Как мне сделать это красивым? Ответы JSON также содержат k_BackingField
Ответы:
По умолчанию вам не нужно использовать ни ,
[Serializable]
ни[DataContract]
для работы с Web API.Просто оставьте свою модель как есть, и веб-API сериализует все общедоступные свойства за вас.
Только если вы хотите иметь больший контроль над тем, что включено, вы затем украшаете свой класс
[DataContract]
и свойства, которые будут включены[DataMember]
(потому что и DCS, и JSON.NET соответствуют этим атрибутам).Если по какой-то причине вам нужен
[Serializable]
ваш класс (например, вы по какой-то причине сериализуете его в поток памяти, выполняете глубокие копии и т. Д.), Тогда вы должны использовать оба атрибута вместе, чтобы предотвратить имена полей поддержки:источник
Существует более общее решение: вы можете настроить сериализатор Json для игнорирования
[Serializable]
атрибута, чтобы вам не приходилось изменять атрибуты в своих классах.Вы должны внести это изменение конфигурации при запуске приложения, то есть в
Application_Start
событии Global.asax :Вы также можете внести другие изменения в сериализацию Json, например указать форматы для сериализации дат и многое другое.
Это будет применяться только к сериализации JSON веб-API. Этот параметр не повлияет на другие сериализации в приложении (XML-сериализация веб-API, MVC JsonResult ...).
источник
Update-Package Newtonsoft.Json
. Е.Попробуйте использовать DataContract вместо Serializable для маркировки вашего класса. Чтобы узнать больше о том, почему, посмотрите это хорошее сообщение в блоге об автоматической сериализации свойств.
источник
Атрибуты [DataContract] у меня не работали, так что это не вариант.
XmlSerializer игнорирует [XmlAttribute] в WebApi
Приведенное выше решение решило эту проблему для меня.
источник