1

ユーザーがコンストラクターに型情報を提供する必要がないように、XMLSerializer を私の「ファサード」クラスの背後に配置したいと考えています。しかし、これを行うには問題があります。このクラスを考えてみましょう:

Class XmlFormatter
    Private Shared xs As XmlSerializer

    Public Function Deserialize(ByVal serializationStream As Stream) As Object
        Dim o As Object = Nothing
        If Not xs Is Nothing Then
            o = xs.Deserialize(serializationStream)
        End If
        Return o
    End Function

    Public Overloads Sub Serialize(ByVal serializationStream As Stream, ByVal graph As Object)
        If xs Is Nothing Then
            xs = New XmlSerializer(graph.GetType())
        End If
        xs.Serialize(serializationStream, graph)
    End Sub
End Class

問題は、このクラスのユーザーは、Serialize で XMLSerializer インスタンスが作成され、共有されるため、最初に Serialize を使用しないと Deserialize を使用できないことです。ただし、このインスタンスなしで Deserialize を使用すると、単純に Nothing が返されます。この問題は解決できますか?

4

1 に答える 1

0

XmlSerializer には型が含まれていません。これは、型が重要でないという XmlSerializer の設計上の決定であるためです。たとえば、以下は 100% 互換性があります。

namespace X {
    public class A {
        public string B;
    }
}
namespace Y.Z {
    [XmlRoot("A"), XmlType("A")]
    public class C {
        [XmlElement("B")]
        public string D {get;set;}
    }
}

これは IMO で最も有用なアプローチであり、次のことが可能です。

  • 生成された/プロキシタイプでの簡単な使用
  • POCO/DTO の切り替え
  • クロスプラットフォームおよびクロスアーキテクチャの使用 (たとえば、WP7/SL/XNA から「完全な .NET」サービスを利用するなど)
  • 厳格なクライアント/サーバー関係のない単純なバージョン管理

基本的に、クライアントは何を期待しているのかを絶対に知っておくべきであり、型に依存するのは間違ったアプローチであるという意見です。

于 2012-03-19T16:36:23.880 に答える