2012-06-27 5 views
3

Фон: Мы используем атрибут, который изменяет результат ответа на объект JSON при передаче определенных заголовков. Другой атрибут возвращает XML, когда передается соответствующий заголовок accept. Если заголовок accept отсутствует или «html», возвращается тестовая страница.DataContractJSONSerializer Вложенные объекты DataContract, содержащие списки

мне нужно, чтобы иметь возможность сериализовать структуру объекта, как это:

[DataContract] 
public class ResponseModel 
{ 
    [DataMember] 
    public bool Success { get; set;} 

    [DataMember] 
    public dynamic Data { get; set; } //I have tried "Object" as well 

    [DataMember] 
    public ApiErrorModel Error { get; set; } 

} 

//for reference 
[DataContract] 
public class ApiErrorModel 
{ 
    [DataMember] 
    public string ErrorCode { get; set; } 

    [DataMember] 
    public string ErrorMessage { get; set; } 
} 

Проблема у меня есть, пока я не был в состоянии проверить все состояния ошибки все же, когда речь идет сериализовать структура, как это:

[DataContract] 
public class DatabaseModel 
{ 
    [DataMember] 
    List<Database> Database { get; set; } 
    //snip implementation 
} 

[DataContract] 
public class Database 
{ 
    [DataMember] 
    [Required] 
    public string DatabaseName { get; set; } 

    [DataMember] 
    List<Guid> APITokens { get; set; } 

    //snip other fields..., Guids and strings... 
} 

Он выходит из строя, давая мне ошибку:

типа '[имена] .Api.Business.Web.Models.DatabaseModel' с именем контракта данных «DatabaseModel: HTTP:// schemas.datacontract.org/2004/07/[namespace].Api.Business.Web.Models 'не ожидается. Подумайте об использовании DataContractResolver или добавьте любые типы, не известные статически в список известных типов - например, с помощью атрибута KnownTypeAttribute или путем добавления их в список известных типов, переданных DataContractSerializer.

Я исследовал использование DataContractResolver, но я не могу заставить его работать с версией JSON. Может быть проще переключиться на JSON.NET или JavaScriptSerializer serializer, но он также должен работать и для XML (это может быть проблема JSON). Мне интересно, есть ли способ исправить это, не добавляя каждый тип списка, который я собираюсь использовать в списке методов сериализации известных типов.

+0

Является ли 'APITokenId'' DataContract'? –

+0

На самом деле, это всего лишь список , мне не удалось эффективно скопировать и вставить между двумя компьютерами. –

+0

Каков ваш контракт на обслуживание, который использует эти контракты данных? Можете ли вы опубликовать определение интерфейса/класса, а также некоторые подписи методов? Возможно, вам придется использовать атрибут «KnownType». –

ответ

0

JSON.NET - это, в основном, путь. Кажется, DataContractJsonSerializer не подходит для этой задачи.

Смежные вопросы