1

私は次のようなシリアル化コンストラクターを介してシリアル化を行います:

private MyClass(SerializationInfo info, StreamingContext c)
{
   try
   {
      MyIntVar = info.GetInt32("MyIntVar");
   }
   catch(Exception)
   {
      Trace.WriteLine("Exception occured! Setting default value.");
      MyIntVar = 4711;
   }
}

私が今達成しようとしているのは、この例外が発生したときにシリアル化されているファイルの名前とパスをトレースすることです。

何かのようなもの:

if( c is file)
{
   Trace.WriteLine("Don't bother, I proceed anyway, but maybe you should repair the file " + FilePath);
}

だから私はこれに関して2つの質問があります:

  1. 現在のシリアル化コンテキストがファイルであるとどのように判断できますか?
  2. このファイルの対応するファイル名とパスを取得するにはどうすればよいですか?
4

1 に答える 1

2

それを行う唯一の方法は、StreamingContext 自分.Contextで作成し、プロパティを介していくつかの追加情報を利用できるようにした場合です。例えば:

var ctx = new StreamingContext(StreamingContextStates.File, "SomeFileName");
//                                                          ^^^^ = context
var serializer = new BinaryFormatter(null, ctx);
// then use serializer.Serialize / .Deserialize

次に、コンストラクターまたはコールバックで、それにアクセスします。

bool isFile = (c.State & StreamingContextStates.File) != 0;

string filename = c.Context as string;
if(filename != null) {
   // ...
}

実際にstringは、かなりあいまいです。他の何かと混同されない独自のカスタムコンテキストタイプを使用することをお勧めします。例えば:

var ctx = new StreamingContext(StreamingContextStates.File,
    new MyStreamingContext { File = "SomeFile" });
...
class MyStreamingContext {
    public string File {get;set;}
}
...
var context = c.Context as MyStreamingContext;
if(context != null) {
    string file = context.File;
    // ...
}
于 2012-11-07T07:10:30.960 に答える