gpt4 book ai didi

c# - 将二进制文件中的类型反序列化为不同应用程序中的不同命名空间(C# .NET)

转载 作者:行者123 更新时间:2023-12-04 17:01:49 26 4
gpt4 key购买 nike

在名为“application1”的应用程序中,我将此结构序列化为二进制:

namespace namespace1
{
[System.Serializeable]
class ClassA
{
List<ClassB> List
}
}

在名为“application2”的应用程序中,我必须反序列化这个二进制文件,但我的 ClassA 和 ClassB 必须在 namespace2 而不是 namespace1 中。

所以我写了一个序列化活页夹:
public class TypeNameConverter : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
assemblyName = Assembly.GetExecutingAssembly().FullName;

if (typeName.Contains("nemespace1."))
typeName = typeName.Replace("nemespace1.", "nemespace2.");

Type retType = Type.GetType(string.Format("{0}, {1}", typeName, assemblyName));
return retType;
}
}

我像这样使用它:
 binaryFormatter.Binder = new TypeNameConverter();
(T)binaryFormatter.Deserialize(memoryStream);

这成功地将namespace1.ClassA反序列化为namespace2.ClassA,但是
无法将列表 od nemespace1.ClassB 进一步反序列化为 namespace2.ClassB 列表。我猜它失败了,因为 ClassB 的列表被封装到 ClassA 中,并且 BindToType() 函数没有为“内部元素”调用,它只为 ClassA 调用一次,然后尝试反序列化 ClassA 并且无法提取 ClassB 列表并出现错误:
 SerializationException: Could not find type
'System.Collections.Generic.List`1[[namespace1.ClassB, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]'.

我不能对 application1 做任何调整(不能改变我做序列化的方式)我只能调整 application2 中的反序列化逻辑。

我正在尝试为这个特定问题找到解决方案,有没有人遇到过类似的问题,或者对如何解决这个问题有想法?

谢谢!

最佳答案

我发现的问题的唯一解决方案是手动更改已序列化的二进制文件中的类型。这包括读取包含类型为 namespace1.ClassA 的序列化对象的二进制文件,在二进制文件中查找表示定义类型的字符串(即“namespace1.ClassA”)的字节,并将这些字节替换为字符串“namespace2.ClassA”,从而使反序列化器认为序列化对象的类型是 namespace2.ClassA 而不是 namespace1.ClassA,这是有效的!

s.o. 的链接问题包含黄金信息、您需要知道的一切以及示例代码。
How to analyse contents of binary serialization stream?

关于c# - 将二进制文件中的类型反序列化为不同应用程序中的不同命名空间(C# .NET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51266868/

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