2012-06-27 6 views
3

Arrière-plan: Nous utilisons un attribut qui modifie la sortie de la réponse à un objet JSON lorsque certains en-têtes sont transmis. Un autre attribut renvoie XML lorsque l'en-tête d'acceptation approprié est transmis. Si l'en-tête accept est manquant ou "html", une page de test est renvoyée.DataContractJSONSerializer Objets DataContract imbriqués contenant des listes

Je dois être en mesure de sérialiser une structure d'objet comme celui-ci:

[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; } 
} 

Le problème que je vais avoir est alors que je ne l'ai pas été en mesure de tester tous les états d'erreur encore, quand il va sérialiser une structure comme celle-ci:

[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... 
} 

Il échoue, me donner l'erreur:

type '[namespace] .Api.Business.Web.Models.DatabaseModel' avec le nom de contrat de données « DatabaseModel: http:// schemas.datacontract.org/2004/07/[namespace].Api.Business.Web.Models 'n'est pas prévu. Envisagez d'utiliser DataContractResolver ou ajoutez des types non connus de façon statique à la liste des types connus, par exemple, en utilisant l'attribut KnownTypeAttribute ou en les ajoutant à la liste des types connus transmis à DataContractSerializer.

J'ai recherché en utilisant un DataContractResolver, mais je n'arrive pas à le faire fonctionner avec la version JSON de celui-ci. Il peut être plus facile de basculer vers le sérialiseur JSON.NET ou JavaScriptSerializer, mais il doit également fonctionner pour XML (il s'agit peut-être d'un problème spécifique à JSON). Je me demande s'il existe un moyen de résoudre ce problème sans ajouter chaque type de liste que je vais utiliser à la liste des méthodes connues de la méthode de sérialisation.

+0

'APITokenId' est-il un' DataContract'? –

+0

En fait, c'est juste une liste , j'ai été incapable de copier et coller efficacement entre les deux ordinateurs. –

+0

Quel est votre contrat de service qui utilise ces contrats de données? Pouvez-vous poster la définition de l'interface/classe et aussi quelques signatures de méthodes? Vous devrez peut-être utiliser l'attribut 'KnownType'. –

Répondre

0

JSON.NET est fondamentalement la voie à suivre. Il semble que DataContractJsonSerializer ne soit pas prêt pour la tâche.

Questions connexes