0

不明なタイプを逆シリアル化できないことを理解しました。

ただし、効率的なコードを作成するために、さまざまなタイプに対してX個のオーバーロードを持つ逆シリアル化するメソッドを作成したくありません。

EG、私のメソッドシグネチャはこれらである可能性があります(増え続けるリスト)

static void deserialiseThis(Dog d)
        {
            Stream reader = new FileStream(@"C:\Documents and Settings\Name\Desktop\demo.xml", FileMode.Open);
            System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(d.GetType());
            Dog d = (Dog)xs.Deserialize(reader);
            DoSomethingDoggy(d);
        }

static void deserialiseThis(Cat t)
        {
//again but for cat
        }


static void deserialiseThis(Mouse t)
        {
//again but for mouse
        }

これを行うのはきれいなようです

static void deserialiseThis<T>(T t)
        {
            //logic
        }

また

static void deserialiseThis(Type t)
    {
        //logic
    }

ただし、このメソッドの問題は、Tを使用してオブジェクトをインスタンス化できないことです。ただし、タイプが何であるかを理解することはできます。

ファクトリパターンを使用するのに理想的な時期ですか?

4

2 に答える 2

2

こんな感じかもしれません

T Deserialize<T>(Stream s)
{
    XmlSerializer ser = new XmlSerializer(typeof(T));
    return (T)ser.Deserialize(s);
}
于 2012-10-12T08:27:12.860 に答える
1

私はこの問題への次のアプローチが好きです。あなたがそれをいくらか利用できることを願っています。

これを使用して、XContainerをストリームから削除できます。

using (var streamReader = new StreamReader(yourStream))
{
    var xDocument = XDocument.Load(streamReader);
    return xDocument;
}

そして、あなたが非常に素晴らしい拡張メソッドを持っているよりも:

public static class XContainerExtensions
{
    public static T Deserialize<T>(this XContainer xmlDocument)
    {
        var xmlSerializer = new XmlSerializer(typeof(T));

        using (var reader = xmlDocument.CreateReader())
        {
            return (T)xmlSerializer.Deserialize(reader);
        }
    }
}

これは次のように使用できます:

var dog = xDocument.Deserialize<Dog>();
于 2012-10-12T08:25:44.537 に答える