2008-12-30 6 views
1

J'ai un code commun de sérialisation d'un objet de classe dans mes 3-4 méthodes, donc je pense créer une fonction commune pour ce code et la fonction appel à toutes les méthodesComment construire DataContractJsonSerialize fonction de commodité

I je suis doingn ce à partir du code ci-dessous

DataContractJsonSerializer ser = new DataContractJsonSerializer(this.GetType()); 
       MemoryStream ms = new MemoryStream(); 
       ser.WriteObject(ms, this); 

       json = Encoding.Default.GetString(ms.ToArray()); 

       ms.Close(); 

Je veux mettre ce code commun en fonction générale seprate qui retourne la chaîne JSON et qui accepte toute la classe comme paramètre d'entrée que je suis en train de convertir toute la classe dans un objet JSON, j'ai essayé créant la fonction comme

GenerateJsonString chaîne publique (classe C1)

mais cela me donne une erreur sur le mot-clé « classe » en disant ce type est nécessaire

Quelqu'un peut-il me dire comment puis-je accepter tout objet de classe dans la méthode seprate ou la fonction

+0

Six réponses en moins de 3 minutes! –

Répondre

4

Vous confondez une « classe » avec un « objet ». Vous sérialiser un objet, qui est une instance d'une classe particulière (aka "Type").

Vous pouvez créer une méthode prenant un paramètre du type de base .NET pour tous les objets, « objet », comme ceci:

public static string GenerateJsonString(object o) 
{ 
    DataContractJsonSerializer ser = new DataContractJsonSerializer(o.GetType()); 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     ser.WriteObject(ms, o); 
     json = Encoding.Default.GetString(ms.ToArray()); 
     ms.Close(); 
     return json; 
    } 
} 
-1

Essayez d'utiliser type au lieu de la classe

public string GenerateJsonString(Type t1) 
+0

Si vous évaluez, avoir le courage d'ajouter un commentaire. – JaredPar

+0

Si vous êtes downvoted, avoir le courage de relire la question et voir si vous l'avez vraiment compris.J'ai donné un -1 pour une réponse incorrecte et un malentendu d'un problème. Ce n'est rien de personnel - ne le prenez pas comme tel. – TheSoftwareJedi

+0

Je ne le prends pas personnellement. Mais dans ce cas, j'ai répondu à la question comme dactylographiée. Le questionneur a passé this.GetType(), pas ceci. Type est le type logique dans ce cas, pas d'objet. – JaredPar

0

Vous pouvez accepter un objet. Une classe n'est pas instanciée et ne peut pas être transmise à la méthode.

+0

On peut instancier un objet "Type" faisant référence à une classe et le transmettre - mais ce n'est pas lié à cette réponse. – TheSoftwareJedi

1

Saisissez le paramètre comme "objet". Vous ne pouvez pas passer une classe en tant que paramètre, seule une instance d'une classe - qui OOP est désigné comme un « objet »

public string GenerateJsonString(object obj) 
1

Si tous les objets que vous passez à cette méthode sont des instances de Les classes qui dérivent d'une classe de base commune, vous pouvez utiliser le polymorphisme et écrire la méthode pour accepter les objets qui sont des instances de la classe de base. Sinon, toutes les classes sont dérivées de System.Object.

1

Ce que vous entendez par "objet de classe" n'est pas clair. Si vous parlez d'un objet, le passage d'une référence à l'objet comme normal ne passe "l'objet entier" (bien, une référence à celui-ci). Vous pouvez obtenir à tous les membres.

Si vous voulez passer le tapez lui-même, vous devez déclarer le paramètre Type - mais je suppose que ce n'est pas vraiment ce que vous voulez.

Si vous voulez écrire une méthode qui accepte un objet, le paramètre simplement déclarer que le type Object:

public string GenerateJsonString(object x) 

Personnellement, je ne voudrais pas utiliser pour convertir le binaire Encoding.Default (qui est spécifique au système) au texte, au fait - quel encodage utilise vraiment le sérialiseur? Vous laisse-t-il passer un TextWriter (par exemple un StringWriter) au lieu d'un flux?

Questions connexes