gpt4 book ai didi

c# - 连载问题

转载 作者:太空宇宙 更新时间:2023-11-03 14:35:04 25 4
gpt4 key购买 nike

我们通过(反)序列化名为“DocumentClass”的类来保存和读取文件。一切都运行良好,直到我们向文档类添加了 2 个字段。 (我们认为这是问题所在)

当我们现在尝试打开由以前版本序列化的文件时,我们会收到错误消息。

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

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

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

我们迷路了...请帮忙...我们已将 [OptionalField] 属性添加到新字段,但这没有帮助..

为什么在 Debug模式下所有的值都是空的??运行时错误来自哪里?我们如何调试它?

提前致谢!

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

最佳答案

.Net 有一个叫做“版本容错序列化”的东西,它很可能解决这个问题;)

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

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

关于c# - 连载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1409927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com