2009-07-27 11 views
22

私は、持続性のためのデータ構造をシリアル化/逆シリアル化するためにXmlSerializerを使用するコードを持っています。 XMLシリアル化の置き換え

  • は、おそらく将来
  • にはサポートされません
  • が不十分なサポート

    • 不良/実装:私は読んでXmlSerializerが一つ以上であることをStackOverflowの上ここではいくつかの場所で聞きました

      私の質問は2つです。上記のいずれかに当てはまりますが、もしそうなら、どのような選択肢が存在しますか?私の目的のために、XMLは非常にうまく動作します。私はそれをずっと一定に保ちたいと思いますが、他のものはすべて変更可能です。

      編集: XML以外の何かを提案したい場合は、私はそれを公開していますが、人間が読めるようにする必要があります。

  • 答えて

    12

    XmlSerializerは完全にサポート可能ですが、いくつかの不具合があります。

    • 比較的遅いです。通常これはまだ十分です。
    • はパブリックメンバーのみサポートしています。書き込みは、リストのアクセサ
    • が必要とする痛みをすることができます -

    しかしちょうど醜いを、私はそれはかなりの時間のためにそこにあり続けることを期待します。 IMOの場合は、で、実際のの問題があります(永続性のために使用される場合)。

    私は(私が作者だので)非常にバイアスんだけど、私はprotobuf-netを選ぶと思います。 Googleの「プロトコルバッファ」ワイヤフォーマットを使用するバイナリシリアライザ。言語/プラットフォーム間の高速、移植性、非常に小さな出力、バージョンの許容性など(もちろん無料です)。明らかにxmlではありません。だから人間が読めるわけではありません。

    +0

    Marc、.net remotingで使用するために、デフォルトのBinaryFormatterをprotobuf-netで置き換えることは簡単に可能ですか? – M4N

    +0

    私はXMLを必要としませんが(ただし、既存のインストールを破ることはないのでいいですが)、私は人間が読める必要があります。しかし、ダウンサイドのリストをありがとう。 –

    +2

    リモートでは、オブジェクトごとに約4行のコードで 'proterb-net経由で' ISerializableを実装することができます。私が得ることができる最高について...これは "ルート"オブジェクト(カプセル化されたものではない)にのみ必要です。人間が読めるように...おそらくJSON.Net? –

    1

    は、.NET 3.5(好ましくSP1)を使用することができる場合、私はDataContractSerializerに見えると思います。それはXmlSerializerよりも設定が簡単ですが、(少なくとも私の経験では)より速く、使いやすく(Webサービスのために)より移植性があります。 SP1はデフォルトの動作を変更してオプトアウトしたので、シリアル化する必要のあるすべての属性を明示的に定義することなく、すべてのクラスをシリアル化できます。

    私は変化としてそれに投資する前に、しかし、それに関するドキュメントを読んで徹底的に推薦します。シリアライゼーションのカスタマイズ方法によっては、うまくいかない場合があります。

    +0

    、私がやった 'XmlSerializer'のものについてあまりにも特別なことは何もありません。上書きやそれ以外のものはありません。 –

    2

    jSONはXMLよりはるかに高速です。 Json.NETを使って読むことができます。それは組み込みのシリアル化を持っています。

    http://james.newtonking.com/pages/json-net.aspx

    +9

    その実績主張をサポートする番号はありますか? –

    +1

    私はいくつかのテストを行いましたが、JSON.Netが生成するファイル/ストリームが小さいことを確認できましたが、シリアル化(インデントされないように設定されている場合)ではスピードが10%向上し、デシリアライズでは約50%遅くなります。これはもちろん、1セットのデータで、1セットのテストに過ぎません。私はまた、私は理想的ではないすべてのオブジェクトの追加の型情報を探すためにそれを伝えなければならなかったジェネリックリスト抽象型の問題のために、逆シリアル化に関する私のJSON.Net設定が遅延を引き起こしていると思われる。 – Tao

    +0

    (JSON.Netももっと快適です - XmlIncludeハックのない非公開型、サブタイプ、複数の方法での再帰参照などを処理できますが、私は決して関連していないことを誓います:)) – Tao

    4

    限りXMLシリアライザとして、そこに "サポート" だ、とそこに "サポート" です。

    XMLシリアライザに接続バグレポートの増加数は戻ってくるバグを認め、そしてバグが修正されないことを述べています。

    は、私はあなたがそれが固定されることを、XMLシリアライザのセキュリティ・クリティカルなバグに遭遇した場合のことを確信しています。しかし、それほど重大ではない他のバグは修正されることはないと思います。

    1

    代替ビューを使用します:
    XmlSerializerはサポートされており、その動作は既知であり、正常に動作します。悪くはないです"。それは非常に一般的で、十分に文書化されており、多くの例があります。パフォーマンスはおそらくあなたが必要とするものに非常に良いでしょう。それはおそらくあなたが必要とするものです。

    XmlSerializerで対処されていない特定のニーズを持つ人がいます。これらの要件から、protobufs、DataContractSerializer、およびその他のオプションが得られます。

    しかし、XmlSerializerは非常に一般的であり、おそらく最も広く適用されるシリアライザです。それはおそらくおそらくコンテンツをシリアライズするための最も安全な賭けです。支持するよう


    ...
    MSは、バグの修正に減速することができます。私はこれをWinFormsと比較します。 WinFormsはもはやマイクロソフトによって推進されている主なUIフレームワークではなくなりました。しかし、それはまだ成熟しており、うまく動作し、うまく動作します。 XmlSerializerは同じです。

    将来のサポートについて。 MSは5 + 5サポートポリシーを持っています。リリース後5年間は製品をサポートしており、5年間追加サポートを購入することができます。 .NET Frameworkはサポートされている「もの」ではありません。サポートされている.NETを含むWindows OSです。 Windows 7には.NET 3.5(バージョンは3.5と思われます)が含まれていますので、WinFormsやXmlSerializerを含む.NET 3.5のすべてが、10月またはWin7がリリースされるたびに、追加の5年間にわたって "正式にサポート"されます。それが.NET 4.0ならば、4.0(WinFormsとXmlSerializerを含む)のものは5年間サポートされます。 5年間のクロックは、新しい製品が.NETに同梱されるたびに再起動します。

    VB6ランタイムを見ると、1998年にVisual Studio 6に同梱されていました。今年リリースされたWindows Server 2008 R2を含め、これまでWindowsに組み込まれていました。したがって、VBランタイムは少なくとも2014年までサポートされます。これは少なくとも16年間の主流サポートです。

    公式サポートまでは何も心配する必要はありません。これは、あなたが話しているオープンソースのプロジェクトではありません。これは、WSEやSOAP Toolkitのようなストップギャップサービスではありません。

    サポートの度合いがあり、新しい.NET APIが起動され、昇格されると古い.NET APIが優先順位を下げることは事実です。しかし、古いものは、おそらくより安定しているでしょう。あなたは完全に安全です。ここで

    +0

    @Cheeso:あなたはバグ修正のペースについて何かを知っていますか?私がやります。重要なバグは、「これは本当のバグです。これはレガシーコードなので、修正するつもりはありません。 –

    +0

    いいえ、私は何も知りません - あなたの直接の観測がおそらく最良の指標です。私は、XmlSerializerを設計し、それを維持するために使用された人々が異なるプロジェクトに移動したことを知っています。新しい所有者に移行しました。 – Cheeso

    +0

    2009年6月28日以降、Connectの問題は「何かを壊す危険があるため、修正するつもりはありません」と閉鎖されています。 XMLシリアライザは常にサポートされています。 –