0

過去にXmlSerializerクラスを使用したことがあり、Serilize メソッドと Deserialize メソッドのジェネリック バージョンを作成することは非常に一般的であることがわかりました。最近手に入れる以前のコードがなかったので、いくつかを検索して、このページを見つけました: http://www.codeproject.com/Articles/233908/Xml-serialization-using-generics#section2

XmlSerializer を使用すると、非常に便利に見えます。いくつかのテストを開始しましたが、 Serializable ではないTimeSpanタイプを使用していることに気付きました。そこで、もう一度オンラインで検索したところ、TimeSpan タイプをサポートしていることが判明したDataContractSerializerクラスが見つかりました。したがって、実際のコードはすべて正常に動作するはずです。

XmlSerializer で一般的に行われているように見えるのと同じ方法で、DataContractSerializer クラスのジェネリック バージョンを作成することに疑問を抱き始めました。オンラインで検索した後、例を見つけることができませんでした。現在、ジェネリックバージョンを作成することは可能だと思いますが、何かポイントがあるかどうか疑問に思っています.

DataContractSerializer に役立つ人は誰でも、これに遭遇したかどうか教えてもらえますか? 標準クラスを使用する前に、ソリューションを設計しすぎたのではないでしょうか?

私のアイデアは、共通のユーティリティ/ツール アセンブリに配置できる汎用ラッパーを作成することでした。これを試して、将来の作業のために構築を開始します。

編集: このサンプルも見つけました: http://books.google.co.uk/books?id=PvNrurEhmiEC&pg=PA108&lpg=PA108&dq=datacontractserializer+generic+wrapper&source=bl&ots=ChCqGuHXIs&sig=-uMLuqd7B1bUj6uWZfTQcScLfe0&hl=en&sa=X&ei=ypw_UdjvKPAwAE=ypw_UdjvKPA

必要なメソッドを実装していないため、コンパイルできないことがわかりました。

4

1 に答える 1

0

まあ、私はあなたがそれを行うことができると思います。実際には、非汎用バージョンも作成できます。これを行う 2 つの関数を次に示します。

public static void Write<T>(T data)
{
    DataContractSerializer dcs = new DataContractSerializer(typeof(T));
    using (MemoryStream stream = new MemoryStream())
    {
        dcs.WriteObject(stream, data);
    }
}

public static void Write(object data)
{
    if (data == null)
        throw new ArgumentNullException();

    DataContractSerializer dcs = new DataContractSerializer(data.GetType());
    using (MemoryStream stream = new MemoryStream())
    {
        dcs.WriteObject(stream, data);
    }
}

全体として、数行のコードを節約でき、一貫したインターフェイスが得られるため、適切に記述している限り (そして、これを単にコピーして貼り付けないでください ;))、これを行うのは合理的なことだと思います。

于 2013-03-12T21:13:17.070 に答える