gpt4 book ai didi

.NET 4.5 MethodInfo 序列化重大更改

转载 作者:行者123 更新时间:2023-12-04 08:45:19 25 4
gpt4 key购买 nike

问题
使用 1.0 版本的程序集序列化的对象(具有私有(private) MethodInfo 字段)不会使用该程序集的 1.1 版本反序列化(将抛出 SerializationException,因为未找到所需的方法)。
有什么改变?
我发现在 .NET 4.5 中 MemberInfo 的序列化机制通过 MemberInfoSerializationHolder已经变了。在过去(直到 .NET 4.0),序列化数据是方法签名(通过简单的 MethodInfo.ToString() 获得)。
根据 .NET 源代码中的注释,他们添加了通过 SerializationToString() 获得的第二个签名。因为:

m_signature stores the ToString() representation of the member which is sometimes ambiguous. Mulitple overloads of the same methods or properties can identical ToString(). m_signature2 stores the SerializationToString() representation which should be unique for each member. It is only written and used by post 4.0 CLR versions.


对于我能看到的 MemberInfoSerializationHolder.GetRealObject()使用此(简化)代码来解析方法(来自 .NET 源代码):
for (int i = 0; i < methods.Length; i++)
{
if (m_signature2 != null) // SerializationToString() signature
{
if (((RuntimeMethodInfo)methods[i]).SerializationToString().Equals(m_signature2))
{
methodInfo = methods[i];
break;
}
}
else
{
if (methods[i].ToString().Equals(m_signature))
{
methodInfo = methods[i];
break;
}
}
}

if (methodInfo == null)
throw new SerializationException(...);
在这种情况下,反序列化失败,因为 m_signature2找不到签名,因为程序集名称包含版本信息,然后 String.Equals()不匹配 MyAssembly, Version=1.0.0.0MyAssembly, Version=1.1.0.0并且会抛出异常。
问题
如果新的搜索失败(至少因为与现有代码的兼容性),我希望框架将失败回到旧的搜索方法。我不明白为什么要与 String.Equals() 进行比较,在运行时解析所有版本的程序集之后(默认情况下将加载新版本),我同意它无法在那里解析程序集版本,但如果严格搜索失败,它可能会删除/忽略它。
我知道序列化 MethodInfo 很糟糕但是此时此修复可能涉及太多更改(架构和代码),并且没有人会在旧代码中开始此重构(此外,必须在两个方向上为旧版本和新版本保持存档的二进制兼容性)。
到目前为止我还没有尝试过,但是这个问题也适用于代表吗?
是否有任何解决方案(带有属性或小的代码更改)来解决这个问题?

最佳答案

我能想到的最好方法是实现 ISerializable (MSDN)

使用 MethodInfo 在对象上实现此接口(interface)properties 让您可以完全控制序列化/反序列化。

缺点是您还必须以某种通用方式处理所有其他属性。不过应该是可以的。

关于.NET 4.5 MethodInfo 序列化重大更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14198668/

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