2010-09-30 9 views
4

Je donne les résultats suivants:En utilisant JSON.NET, comment puis-je sérialiser ces membres hérités?

public class MyClass : SuperClass {  
    [JsonProperty] 
    public virtual string Id { get; set; } 
} 

public abstract class SuperClass { 
    public int GetHashCode() { 
    //do things here 
    } 
} 

Je ne peux pas modifier SuperClass. Quand je vais à la sérialisation à l'aide JSON JsonNet je ferai quelque chose comme ceci:

JsonSerializerSettings serializer = new JsonSerializerSettings { 
     //serializer settings 
    }; 

    var jsonNetResult = new JsonNetResult { 
     Data = myClass, 
     SerializerSettings = serializer 
    }; 

    return jsonNetResult; 

Il est évident que ce ne sera pas sérialiser GetHashCode(). Si je vais:

var jsonNetResult = new JsonNetResult { 
     Data = myClass.GetHashCode(), 
     SerializerSettings = serializer 
    }; 

Il correctement sérialiser la valeur, est-il un paramètre sérialiseur je peux utiliser pour le dire d'inclure GetHashCode()?

Edit: Je dois ajouter que je suis en ce moment la création d'une propriété avec seulement arriver à cette fin, à savoir

[JsonProperty] 
public virtual int GetHashCodeJson { get { return GetHashCode(); } 

Répondre

0

Ce n'est pas tellement un problème avec JSON.Net comme avec sérialisation .net dans général.

Vous devez sérialiser les objets par leurs propriétés et vous demandez de sérialiser la valeur de retour d'une méthode. Il n'y a donc pas moyen de le faire avec la syntaxe que vous voulez.

que vous êtes en mesure de le faire:

Data = myClass.GetHashCode() 

signifie seulement que la valeur de retour de la méthode (un entier) peut être sérialisé et non que le sérialiseur se soucie du tout quelle est la méthode que la valeur est à venir de.

Si vous y pensez, il n'y a pas beaucoup de sens à dire qu'une valeur est la valeur de retour sérialisée d'une méthode, car comment la désérialiser alors? Vous ne seriez jamais capable d'écrire la valeur à la méthode parce que c'est une valeur de retour seulement, pas une relation bidirectionnelle comme une propriété avec {get; set;}.

+0

Eh bien un moyen de contourner c'est d'avoir une propriété sans get et pas de jeu, qui fait référence à la méthode, qui fonctionne bien. Y a-t-il une meilleure façon de gérer cela? Ensuite, vous obtenez des propriétés alambiquées comme GetHashCodeJson {get {return GetHashCode(); }} –

+0

Je suis d'accord que le nom n'est pas si bon. Dans votre cas, il pourrait s'agir simplement de HashCode au lieu de GetHashCodeJson si vous vouliez le faire, mais le problème reste le même, vous avez besoin d'un nom différent pour la propriété que la méthode. –