11

私が取り組んでいるプロジェクトの既存のコードを調べていると、次のように実装されているクラスが見つかりました。

public class ThingOne
{
    private int A;

    private int B;

    [NonSerialized]
    private System.Timers.Timer timer1;
}

もっとこう見えていいんじゃない?

[Serializable]
public class ThingOne
{
    private int A;

    private int B;

    [NonSerialized]
    private System.Timers.Timer timer1;
}

または、クラス自体がシリアライズ可能でない場合でも、[NonSerialized] を追加することには追加の利点がありますか?

4

5 に答える 5

14

または、クラス自体がシリアライズ可能でない場合でも、[NonSerialized] を追加することには追加の利点がありますか?

クラスはシールされていないため、別のクラスがそのオブジェクトから継承できます。そのクラスを Serializable としてマークすると、NotSerializable 属性が有効になります。(ただし、プライベートメンバーについては指摘されていません)。

リフレクションによっても属性を確認できることを忘れないでください。シリアル化すべきものとすべきでないものをチェックするためにランタイムによって使用されることはありません。ある種のカスタム シリアライゼーションを扱うプログラム内の何かのマーカーとして使用される可能性があります (これが良い考えであると言っているわけではありません少なくとも)。

于 2010-09-17T14:00:21.247 に答える
8

Serializable が使用されていない場合、NonSerialized は効果がありません。デフォルトでは、クラスとそのメンバーはシリアル化できません。

クラスがシリアル化されていないときに何かを NonSerialized として宣言する唯一の利点は、クラスが Serialized オブジェクトによって継承され、継承されたメンバーがシリアル化できないという状況下にあることです。

MSDNから:

'NonSerialized' 属性はこのメンバーに影響しません。これを含むクラスは 'Serializable' として公開されていないためです。

デフォルトでは、クラスとそのメンバーはシリアル化できません。NonSerializedAttribute 属性は、シリアル化可能なクラスのメンバーをシリアル化してはならない場合にのみ必要です。

于 2010-09-17T13:58:17.820 に答える
5

次の 2 つの理由が考えられます。

  1. フィールドがシリアル化されていないことが重要な場合があります。したがって、将来クラスがシリアライズ可能になったとしても、バグ、非効率性、またはセキュリティ上の問題が発生することはありません。これは、クラスをシリアライズ可能にマークしないと、フィールドに対してもそうなるからです。

  2. 彼らは、属性のある種のカスタム使用を行っている可能性があります

ケース 2 の場合、これが起こっていることはコードの他の場所から明らかです。ただし、1番は良い習慣です。

ケース 1 は優れたプラクティスです。YAGNI (「あなたはそれを必要としない」-「後で必要になる場合に備えて」作業を行わない) と「大丈夫ですが、後で必要になった場合は、このフィールドが例外であることを誰かが見逃した場合、災害になります。

したがって、ここでは効果がありませんが、効果が現れ始めるシナリオでは間違いなく良い方法です。

編集:別の可能性は、それが実際にシリアル化可能であったか、作成者が当時2つの心にあり、完全に「終了」したことがない以前のバージョンからのクラフトです(作業コードは完全に終了しましたか?)。何かがコードにあるからといって、そのように意図されているわけではありません。それでも、何かをシリアル化しないことが本当に重要な場合は、上記の理由からこれをマークすることをお勧めします。

于 2010-09-17T14:04:05.077 に答える
4

MSDN SerializeAttributeは、「SerializableAttribute 属性を型に適用して、この型のインスタンスをシリアル化できることを示す」と述べています。これは、それがないと、クラスをシリアル化できないことを意味します。私はこれを試みたと思います.NonSerializable型で試みた場合、シリアライズは例外をスローします.

于 2010-09-17T14:02:21.330 に答える
2

私はグレッグに同意します.MSDNは同様の方法でそれを述べています.参考文献を引用することは良い考えです..

「デフォルトでは、クラスとそのメンバーはシリアル化できません。NonSerializedAttribute 属性は、シリアル化可能なクラスのメンバーをシリアル化してはならない場合にのみ必要です。」

http://msdn.microsoft.com/en-us/library/dwys85sk(VS.80).aspx

于 2010-09-17T14:01:42.513 に答える