我们通过(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;
}
}
答案 0 :(得分:1)
.Net有一种称为“版本容忍序列化”的东西,很可能解决了这个问题;)
您应该查看关于对象序列化的这个易于理解的示例:
http://programming.flashadventures.com/c-sharp/writing-objects-to-files-serialization/
答案 1 :(得分:0)
我假设您正在使用BinaryFormatter
?这个序列化程序非常脆弱,因为它(默认情况下)包含流中的字段名称;这会影响混淆particularly badly。据推测,混淆器现在正在为字段选择新命名(可能是随机的,可能是由于新字段),因此无法正确反序列化。
一些选择:
ISerializable
,因此字段名称无关紧要我个人会选择后者,但我有点偏颇;-p我知道人们使用protobuf-net进行混淆的课程;数据只包含数字标记,因此其含义并未真正暴露(当然,通过检查数据 - 邮政编码等,但这是加密工作)。
答案 2 :(得分:0)
我认为您需要使用Custom Serialization