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

所以我对此有两个问题:

  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 回答