Come costruire la funzione di convenienza DataContractJsonSerializer
Domanda
Ho un codice comune per serializzare un oggetto di classe nei miei metodi 3-4, quindi sto pensando di creare una funzione comune per quel codice e chiamare la funzione in tutti i metodi
Lo sto facendo dal seguente codice
DataContractJsonSerializer ser = new DataContractJsonSerializer(this.GetType());
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, this);
json = Encoding.Default.GetString(ms.ToArray());
ms.Close();
Voglio mettere questo codice comune in una funzione generale separata che restituisce una stringa Json e che accetta tutta la classe come parametro di input mentre sto convertendo l'intera classe in un oggetto Json, ho provato a creare una funzione come
stringa pubblica GenerateJsonString (classe C1)
ma questo mi dà errore sulla parola chiave " class " dicendo che il tipo è richiesto
Qualcuno può dirmi come posso accettare l'intero oggetto di classe nel metodo o nella funzione separati
Soluzione
Stai confondendo una classe " con un "oggetto". Serializzi un oggetto, che è un'istanza di una particolare classe (aka "Tipo").
Puoi creare un metodo prendendo un parametro del tipo base .NET per tutti gli oggetti, " oggetto " ;, in questo modo:
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;
}
}
Altri suggerimenti
Digita il parametro come " oggetto " ;. Non puoi passare una classe come parametro, solo un'istanza di una classe, che in OOP viene definita "oggetto" "
public string GenerateJsonString(object obj)
Se tutti gli oggetti che passi a questo metodo sono istanze di classi che derivano da una classe base comune, puoi usare il polimorfismo e scrivere il metodo per accettare oggetti che sono istanze della classe base. Altrimenti, tutte le classi sono derivate da System.Object
.
Non è chiaro cosa intendi per "oggetto di classe". Se intendi un oggetto, passare un riferimento all'oggetto normalmente passa "l'intero oggetto" (bene, un riferimento ad esso). Puoi ottenere tutti i membri.
Se si desidera passare il tipo stesso, è necessario dichiarare il parametro come Tipo - ma sospetto che non sia proprio quello che vuoi.
Se vuoi scrivere un metodo che accetti qualsiasi oggetto, dichiara semplicemente il parametro come type Oggetto :
public string GenerateJsonString(object x)
Personalmente non userei Encoding.Default
(che è specifico del sistema) per convertire il binario in testo, a proposito: quale codifica sta usando il serializzatore? Ti consente di passare un TextWriter (ad esempio un StringWriter) anziché uno stream?
Puoi accettare un oggetto. Una classe non viene istanziata e non è possibile passarla al metodo.
Prova a utilizzare Tipo anziché la classe
public string GenerateJsonString(Type t1)