質問

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

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;
}

それとも、クラス自体がシリアル化できない場合でも、[非論文]を追加することにいくつかの追加の利点がありますか?

役に立ちましたか?

解決

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

クラスがシリアル化されていない場合に非文字化されたものを宣言するという唯一の利点は、クラスがシリアル化されたオブジェクトによって継承され、継承されたメンバーがシライア化できないという状況下にあります。

から MSDN:

「非セリア化された」属性は、その含有クラスが「シリアル化可能」として公開されていないため、このメンバーに影響しません。

デフォルトでは、クラスとそのメンバーはシライア化できません。 Serializableクラスのメンバーをシリアル化しないでください。

他のヒント

それとも、クラス自体がシリアル化できない場合でも、[非論文]を追加することにいくつかの追加の利点がありますか?

クラスは封印されていないため、別のクラスがそのオブジェクトから継承できます。そのクラスはシリアル化可能としてマークされる可能性があり、その後、Notserializable属性が作用します。 (ただし、私的なメンバーのためではないと指摘されていますが)。

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

私は2つの理由を考えることができます:

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

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

ケース2では、コードの他の場所からこれが起こっていることが明らかになります。ナンバー1は良い練習です。

ケース1は良い練習です。それはYagni(「あなたはそれを必要としない」 - 後で必要な場合に仕事をしていない」のバランスをとる価値がありますが、「後で必要な場合は、誰かがこの分野が例外であることを見逃している場合、災害になりましょう。

したがって、ここでは効果はありませんが、効果が始まるシナリオにとっては間違いなく良い習慣です。

編集:もう1つの可能性は、それが実際にシリアル化可能であったか、著者が当時2つの心にあった以前のバージョンのCruftであり、完全に「完成」したことはないということです(動作コードは完全に終了しましたか?)。何かがコードにあるからといって、それがそのようになることを意図していたという意味ではありません。それでも、何かがシリアル化されないことが本当に重要であれば、上記の理由でこれをマークすることは良い習慣だとまだ言います。

MSDN serializeattribute 「SerializableAttribute属性をタイプに適用して、このタイプのインスタンスをシリアル化できることを示す」と述べています。これは、それがなければ、クラスをシリアル化できないことを意味します。私はこれを試みたと思いますし、シリアル化が非文字化可能なタイプで試みられた場合、例外がスローされると思います。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top