1

BinaryFormatter を使用して、条件によってクラスとその変数をシリアル化しています。例えば:

[Serializable]
public class Class1
{
private Class2 B;
...
}

[Serializable]
public class Class2{...}

変数 B は、ファイル ストレージにシリアル化するときではなく、リモーティング時にのみシリアル化する必要があります。質問:
1) XmlSerialization では、[XmlIgnore] と {PropertyName}Specified を使用して条件付きでプロパティを無視できることを知っています。それは [NonSerialized] と同等の方法ですか?
2) [Serializable] 属性を持つクラスの場合、実行時にそれを無視する方法は?

4

3 に答える 3

0
  1. すでに述べたように、それは存在しません。少し面倒ですが (既に提案されているように ISerializable インターフェイスを実装したくない場合)、コードを作成することもできます。

    [Serializable]
    public class ClassA
    {
        [OnSerializing]
        private void OnSerializing(StreamingContext context)
        {
            //Set BSerialized = B based on context or some internal boolean
            BSerialized = B;
        }
        [OnSerialized]
        private void OnSerialized(StreamingContext context)
        {
            //Clear BSerialized
            BSerialized = null;
        }
        [OnDeserialized]
        private void OnDeserialized(StreamingContext context)
        {
            //Restore B from BSerialized
            B = BSerialized;
            BSerialized = null;
        }
        [NonSerialized]
        private ClassB B;
        private ClassB BSerialized;
    }
    [Serializable]
    public class ClassB { }
    
  2. 無視することはできません。実行時にのみ属性のプロパティを変更できます。NonSerialized 属性は true / false 引数を取らないため、実行時に何もできません。

于 2010-09-06T12:37:07.997 に答える
0

バインディングを使用してこの種の問題を解決するために、かなりシンプルだが拡張可能なフレームワークを作成しました。完全に理解しているかどうかはわかりませんが、これは可能です:

public class Class1
{
  [Ignore]
  public bool IsRemoting { get; set; }

  [SerializeWhen("IsRemoting", true)]
  public Class2 B;
}

http://binaryserializer.codeplex.com

于 2013-03-08T04:48:07.390 に答える
0
  1. そのような方法はありません。を実装することでシリアライゼーションを制御できISerializableます。実行すると、どのシリアライゼーション コンテキストがアクティブかがわかります (リモーティング、ファイルなど)。
  2. 私の知る限り、それを行う方法はありません。なぜこれが必要なのですか?

一般的に言えば、 を使用しないことをお勧めしますBinaryFormatter。これまでにあったとしたら、それはメンテナンスの頭痛です。XML シリアライゼーションまたはある種のプロトコル バッファを使用します。

于 2010-09-06T03:46:50.353 に答える