序列化问题

时间:2009-09-11 09:23:46

标签: c# serialization

我们通过(de)序列化名为“DocumentClass”的类来保存和读取文件。 一切都很顺利,直到我们在文档类中添加了两个字段。 (我们认为这是问题)

当我们现在尝试打开上一版序列化的文件时,我们会收到错误。

System.ArgumentException:“System.Int32”类型的对象无法转换为“System.String”类型。    在SoftwareProject.Componenten.Bestand.DocumentClass.d(String A_0)    at de..ctor(String A_0)    at g.a(String A_0)

产生错误的方法是方法“Read”。 (DocumentClass.d()是混淆的名称)

但事情变得更奇怪了:当我们在VS调试模式下打开文件时,没有生成错误,但文档类中的所有字段都是0或null ???

我们迷失在这里......请帮助...... 我们已经将[OptionalField]属性添加到新字段中,但这没有帮助..

为什么在调试模式下所有值都为null? 运行时错误来自哪里?我们如何调试呢?

提前致谢!!

public static DocumentClass Read(string fullFilePath)
{

     DocumentClass c = new DocumentClass();
     Stream s = File.OpenRead(fullFilePath);
     BinaryFormatter b = new BinaryFormatter();
     //b.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
     b.Binder = new MyCustomBinder(); 

     try
     {
      c = (DocumentClass)b.Deserialize(s);
     }
     catch( Exception exc )
     {
      s.Close();
      throw exc;
     }
     finally
     {
      s.Close();
     }
     return c;
        }


        public class MyCustomBinder : SerializationBinder {

     public override Type BindToType(string assemblyName, string typeName) {
      Type tyType = null;
      string sShortAssemblyName = assemblyName.Split(',')[0];
      Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
      if (sShortAssemblyName.ToLower() == "debugAssemblyName")
      {
       sShortAssemblyName = "AppAssemblyName";
      }
      foreach (Assembly ayAssembly in ayAssemblies) {
       if (sShortAssemblyName == ayAssembly.FullName.Split(',')[0]) {
        tyType = ayAssembly.GetType(typeName);
        break;
       }
      }
      return tyType;
     }
}

3 个答案:

答案 0 :(得分:1)

.Net有一种称为“版本容忍序列化”的东西,很可能解决了这个问题;)

您应该查看关于对象序列化的这个易于理解的示例:

http://programming.flashadventures.com/c-sharp/writing-objects-to-files-serialization/

答案 1 :(得分:0)

我假设您正在使用BinaryFormatter?这个序列化程序非常脆弱,因为它(默认情况下)包含流中的字段名称;这会影响混淆particularly badly。据推测,混淆器现在正在为字段选择新命名(可能是随机的,可能是由于新字段),因此无法正确反序列化。

一些选择:

  • 不要混淆DTO
  • 实施ISerializable,因此字段名称无关紧要
  • 使用不关心字段名称的序列化程序

我个人会选择后者,但我有点偏颇;-p我知道人们使用protobuf-net进行混淆的课程;数据只包含数字标记,因此其含义并未真正暴露(当然,通过检查数据 - 邮政编码等,但这是加密工作)。

答案 2 :(得分:0)

我认为您需要使用Custom Serialization

相关问题