gpt4 book ai didi

c# - 永远不会调用 XmlSerializer 中覆盖的反序列化

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

我正慢慢感到自己的理智在边缘磨损,而我的思绪也在慢慢耗尽。

我想扩展由于某种原因不支持反序列化通知的 XmlSerializer。

我有以下代码:

public class NotificationXmlSerializer : XmlSerializer
{
public NotificationXmlSerializer(Type type)
: base(type)
{
}

protected override object Deserialize(XmlSerializationReader reader)
{
var x = base.Deserialize(reader);
var methods = x.GetType().GetMethods().Where(method => method.GetCustomAttributes(true).Any(attr => attr is OnDeserializedAttribute));

return x;
}
}

并以这种方式使用它:

    using (MemoryStream fs = new MemoryStream())
{
var x = new NotificationXmlSerializer(typeof(int));
x.Serialize(fs, 5);
fs.Seek(0, SeekOrigin.Begin);
var y = x.Deserialize(fs);
}

但是,如果我在我的反序列化覆盖中放置一个断点,它永远不会被击中!即使我故意在那里抛出异常,程序功能也是正常的,所以我确信它永远不会被命中。

为什么他们会让我重写一个内部方法反序列化而不让我通过它影响任何东西?

我做错了什么?

最好的问候,麦克斯

最佳答案

首先,正如 MSDN 所说,该方法仅供内部使用:

This API supports the .NET Framework infrastructure and is not intended to be used directly from your code.

其次,如果您使用 Reflector 查看 XmlSerializer,您会发现调用此方法的唯一位置。简化的控制流程是:

public object Deserialize(XmlReader xmlReader, string encodingStyle, XmlDeserializationEvents events)
{

try
{
if (this.primitiveType != null)
{

return this.DeserializePrimitive(xmlReader, events);
}
if ((this.tempAssembly == null) || this.typedSerializer)
{
XmlSerializationReader reader = …
try
{
return this.Deserialize(reader);

即使此方法 (Deserialize(XmlReader, string, XmlDeserializationEvents)) 是从所有其他 Deserialize 方法调用的,但这并不意味着控制流必须结束在 Deserialize(XmlSerializationReader) 中。

我的建议:获取 XmlSerializer 的引用源,研究其行为,然后以另一种方式解决您的问题,或者以调用覆盖的方式调整外部条件。就我个人而言,我会避免依赖重写方法。您最终会更稳定的行为防止与框架的 future 版本的兼容性问题

关于c# - 永远不会调用 XmlSerializer 中覆盖的反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5212072/

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