0

Reader C# プロジェクトは ~POCO をファイルに保存する必要があります。しかし、私たちはデビューしたばかりで、頻繁に変化が起こります。私たちのソフトは、すでに少数の顧客によって使用 (持続) されています。多くの理由から、私は何よりも XML を使用することを好みます。

多くの xml シリアライゼーション ライブラリをチェックしました。

  • 多くのライブラリには、特定のタイプとバージョンが格納されています。私はそれを必要としません。
  • 多くのライブラリでは、自分でシリアル化する可​​能性はありません。つまり、データをカスタムでロード/保存するためのインターフェースが必要です (多くの利点が見られます **)。
  • 一部のライブラリでは、コンストラクターを空にする必要があります
  • 一部のライブラリはパブリック プロパティのみを管理します
  • 一部のライブラリには、型に多くの制限があります (辞書をサポートしていないなど)。

** (データをロード/保存するインターフェースの利点)

  • 多くのバージョンの管理が容易
  • 必要に応じてハードコーディングされた変換を有効にします (クラス x -> クラス y、…)
  • 古いコードを保持しない方が簡単

私のニーズには、C++ での逆シリアル化に少し似た古い方法を使用する方がよいと強く思います。属性を使用する代わりに、フィールドとフィールド名を手動で追加できるようにする方がよいと思います。

すこし:

void XmlDeserialize(XmlReader xmlReader)
{
  xmlReader.Load((n)=>Version(n)); // or just: _version = xmlReader.LoadInt("Version"); 
  xmlReader.Load((n)=>Name(n));
  xmlReader.Load((n)=>EmployeeId(n));

    if (Version ==2)
                    …

    If (version == 3)
                    …

私のニーズに最も近いのは、IExtensibleDataObject をサポートする DataContractSerializer ですが、使用するのは面倒です。

私はどこでも間違っていないかどうか自問しますか?その必要性(またはこのビジョン)を持っているのは私だけではありません。そのためのライブラリを誰も書いていないのはなぜですか?

私が間違っていると思うことは何ですか?おすすめは何ですか ?

4

2 に答える 2

0

私は最終的にこの使用方法のように XmlSerialization を使用することにしまし たが、デフォルトのコンストラクターを作成することを余儀なくされ、メンバー (プライベートまたはパブリック) をシリアル化できないことを嫌います。

また、非常に高速が必要な場合は、ProtoContract を使用することにしました。

しかし、私の好みは DataContractSerializer で、xml 形式 (デバッグが容易) を提供し、デフォルトのコンストラクターは不要で、任意のメンバーをシリアル化できます。

于 2013-12-19T19:17:34.813 に答える
0

これには XML reader.load を使用する必要がありますか? 以下のように、XML データを表すビジネス オブジェクトを作成し、オブジェクトを逆シリアル化する方がはるかに簡単です (申し訳ありませんが、これの vb.net バージョンしか見つかりませんでした)。

Public Shared Function ReadFromString(ByVal theString As String, ByVal encoding As System.Text.Encoding, ByVal prohibitDTD As Boolean) As T
        Dim theReturn As T = Nothing
        Dim s As System.Xml.Serialization.XmlSerializer
        s = New System.Xml.Serialization.XmlSerializer(GetType(T))

        Dim theBytes As Byte() = encoding.GetBytes(theString)
        Using ms As New IO.MemoryStream(theBytes)
            Using sTr As New StreamReader(ms, encoding)
                Dim sttng As New XmlReaderSettings
                'sttng.ProhibitDtd = prohibitDTD
                If Not prohibitDTD Then
                    sttng.DtdProcessing = DtdProcessing.Ignore
                    sttng.XmlResolver = Nothing
                Else
                    sttng.DtdProcessing = DtdProcessing.Prohibit
                End If
                Using r As XmlReader = XmlReader.Create(sTr, sttng)
                    theReturn = CType(s.Deserialize(r), T)
                End Using
            End Using
        End Using


        Return theReturn
    End Function

必要に応じて、xmlreadersettings とエンコーディングをイベントで取り除くことができます。しかし、この方法で、所有しているバージョンごとに異なるビジネス オブジェクトを保持できますか? さらに、オブジェクトを追加するだけで (変更や削除はしない)、すべてのバージョンで最新のビジネス オブジェクトを引き続き使用でき、欠落しているフィールドは無視できます。

于 2012-05-31T22:05:52.847 に答える