2

XmlSerializer を使用して C# クラスをシリアル化する場合、クラスのプロパティを表す属性/要素は、ソース コードと同じ名前になります。

次のようにして、これをオーバーライドできることを知っています。

[XmlAttribute("num")]
public int NumberOfThingsThatAbcXyz { get; set; }

クラス用に生成された XML をできるだけコンパクトにしたいのですが、もちろん、反対側で自動的に逆シリアル化できるようにしたいと考えています。

これらの名前を手動で考えて短い文字列ですべてに注釈を付けることなく、可能な限り縮小する方法はありますか? 結果として得られる XML が人間が簡単に読めるようになることは問題ではありません。

4

4 に答える 4

2

うーん、このようなマイクロ最適化に注意してください。最新のコンピューティング ハードウェアでそれらを完済させるのは非常に困難です。XML の処理に関連する I/O の真のコストは、データの量ではなく、データを見つけることです。バイトは安く、送信はすでに高度に最適化されています。プログラムの実行速度を決定するのは、サーバーのどこか (おそらく自分のマシン) で研磨されるディスク ドライブの読み取りヘッドです。適切な場所に配置されると、1 バイトの読み取りは、1 キロバイトの読み取りとほぼ同じくらいのコストがかかります。メモリも同じように機能します。

究極のヒント: これが一般的な最適化であれば、IXmlSerializable よりも優れたものを思いついたはずです。

于 2010-04-24T16:14:16.857 に答える
1

人間の可読性が問題ではない場合...xml使用する理由-おそらく「プロトコルバッファ」(利用可能なC#実装があります)のようなものは、この問題なしで、すべてを取得するいくつかの方法を含む、望ましいレベルの相互運用性を提供しますプロパティは自動的に(興味があれば、これについてもっと話すことができます)。

もう1つの方法は、単にデータをgzipで圧縮することです。繰り返されるすべてのノード名のおかげで、xmlは驚くほどうまく圧縮されます。

于 2010-04-24T18:40:07.037 に答える
1

属性の性質上、これは不可能です。理由については、can-attributes-be-added-dynamically-in-c#を参照してください。たとえそれができたとしても、おそらくそれだけの価値はないというハンスの意見に同意します。これについて本当に心配している場合は、Marc の提案の 1 つを使用する必要があります。

于 2010-04-25T05:53:03.153 に答える
1

属性を使用して実行できる以上の XML シリアライゼーションをカスタマイズするには、クラスにIXmlSerializableインターフェイスを実装する必要があります。

于 2010-04-24T14:26:08.850 に答える