2

アプリケーション コードを難読化しながら、シリアル化を使用してアプリケーション データを保存できるようにするために、シリアル化されたすべてのメンバーの名前をカスタムのシリアル化名にマップしたいと考えています。ISerizableInterface を実装することでこれを実現できることはわかっていますが、MSDN では、シリアル化に OnDeserializedAttribute、OnSerializingAttribute、OnSerializedAttribute、および OnDeserializingAttribute を使用することを提案しています。そのため、OnSerializingAttribute を使用してメンバーの名前を変更したいと思います。問題は、メンバーがシリアル化される名前を明示的に決定する方法が見つからないことです。

OnSerializingAttribute を使用してシリアル化の名前を明示的に定義することは可能ですか?

4

3 に答える 3

1

あなたの場合、カスタムシリアライゼーションと ISerializable インターフェイスが最も効率的な方法になると思います。ここでサンプルをチェックしてください。また、あなたが言及した ISerializable 属性とシリアライゼーション属性の両方に関する良いディスカッション スレッドもあります

フォーマットを完全に制御したい場合は、カスタムシリアライザーを使用する必要があり、(デ) シリアライゼーションフローに応答したい場合は、属性が最適なオプションです。

于 2009-03-30T15:40:38.870 に答える
1

(編集:何度も役に立つのを見たので、これをブログ エントリとして書くことにしました)

これにはprotobuf-netを使用する前にユーザーがいました。これは、Google の密なバイナリ「プロトコル バッファ」ワイヤ フォーマットを使用します。これには、ワイヤ上に名前は含まれず、数字のみが含まれます。この意味は:

  • 名前はネットワーク上で公開されません
  • 実行時のクラスの名前が「DateOfBirth」か「a1v」かは関係ありません

これは、整数タグをメンバー (プロパティまたはフィールド) に割り当てることで機能します。たとえば、次のようになります。

[ProtoMember(4)]
public DateTime DateOfBirth {get;set;}

シリアル化では「4」のみが使用されますが、(重要なことに) 大量のシリアル化コードを維持する必要はありません。ISerializableリモート処理を使用する必要がある場合は、非常に簡単にフックすることもできます。また、必要に応じて WCF フックもあります。

開示:私は著者なので、偏見がありますが、ツールは無料なので、見ても何も失うことはありません;-p

于 2009-03-30T19:21:47.840 に答える
1

.NET4 または .NET4.5 を使用している場合は、独自の DataContractResolver を定義して属性の名前を変更できますが、属性で圧縮された名前を使用する方が簡単[DataMember(...)]です。

于 2012-05-29T16:03:30.107 に答える