DataContractJsonSerializeコンビニエンス関数を構築する方法
質問
3〜4個のメソッドでクラスオブジェクトをシリアル化する共通のコードがあるので、そのコードに共通の関数を作成し、すべてのメソッドで関数を呼び出す
次のコードからこれを実行しています
DataContractJsonSerializer ser = new DataContractJsonSerializer(this.GetType());
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, this);
json = Encoding.Default.GetString(ms.ToArray());
ms.Close();
この共通コードをJson文字列を返し、クラス全体をJsonオブジェクトに変換するときに入力パラメータとしてクラス全体を受け入れる別の一般的な関数に入れたいと思います、私は
のような関数を作成してみましたpublic string GenerateJsonString(class C1)
しかし、これはキーワード" class"にエラーを与えています。そのタイプが必要であると言って
seprateメソッドまたは関数でクラスオブジェクト全体を受け入れる方法を教えてください。
解決
「クラス」を混同しています「オブジェクト」を使用します。特定のクラスのインスタンス(別名「タイプ」)であるオブジェクトをシリアル化します。
次のように、すべてのオブジェクトの.NETベースタイプのパラメーターをとるメソッドを作成できます。
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;
}
}
他のヒント
パラメーターを「オブジェクト」として入力します。クラスをパラメーターとして渡すことはできません。クラスのインスタンスのみを渡すことができます。OOPでは、これを「オブジェクト」と呼びます
public string GenerateJsonString(object obj)
このメソッドに渡すすべてのオブジェクトが共通の基本クラスから派生するクラスのインスタンスである場合、多態性を使用してメソッドを記述し、基本クラスのインスタンスであるオブジェクトを受け入れることができます。それ以外の場合、すべてのクラスは System.Object
から派生します。
"クラスオブジェクト"の意味が明確ではありません。オブジェクトを意味する場合、オブジェクトへの参照を通常どおり渡すと、「オブジェクト全体」が渡されます。 (まあ、それへの参照)。すべてのメンバーを取得できます。
type 自体を渡す場合は、パラメーターをタイプ-しかし、それは実際にはあなたが望むものではないと思う。
オブジェクトを受け入れるメソッドを作成する場合は、パラメータをオブジェクト:
public string GenerateJsonString(object x)
個人的には、 Encoding.Default
(システム固有)を使用してバイナリをテキストに変換することはしません-シリアライザーは実際にどのエンコーディングを使用していますか?ストリームの代わりにTextWriter(たとえばStringWriter)を渡すことができますか?
オブジェクトを受け入れることができます。クラスはインスタンス化されないため、メソッドに渡すことはできません。
クラスの代わりにTypeを使用してみてください
public string GenerateJsonString(Type t1)