C# 永远不会调用XmlSerializer中重写的反序列化
我慢慢地感觉到我的理智在边缘磨损,而我的思想在慢慢地枯竭 我想扩展XmlSerializer,因为某些原因它不支持反序列化通知 我有以下代码:C# 永远不会调用XmlSerializer中重写的反序列化,c#,extend,xmlserializer,C#,Extend,Xmlserializer,我慢慢地感觉到我的理智在边缘磨损,而我的思想在慢慢地枯竭 我想扩展XmlSerializer,因为某些原因它不支持反序列化通知 我有以下代码: public class NotificationXmlSerializer : XmlSerializer { public NotificationXmlSerializer(Type type) : base(type) { } protected override object Deserial
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);
}
但是,如果我在反序列化覆盖中放置断点,它将永远不会被命中!即使我故意在那个里抛出一个异常,程序功能也是正常的,所以我确信它永远不会被命中
为什么他们让我重写一个反序列化的内部方法,而不让我通过它影响任何东西
我做错了什么
请首先向Max致意,因为MSDN表示该方法用于内部目的: 此API支持.NET Framework基础架构,不打算直接从代码中使用 其次,如果您使用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);
…
即使从所有其他反序列化
方法调用此方法(反序列化(XmlReader,string,XmlDeserializationEvents)
),但这并不意味着控制流必须以反序列化(XmlSerializationReader)
结束
我的建议是:获取
XmlSerializer
的参考源,研究其行为,或者用另一种方式解决问题,或者用调用重写的方式调整外部条件。就我个人而言,我会避免依赖重写该方法。您最终将获得更稳定的行为和防止与框架未来版本的兼容性问题。首先,正如MSDN所说,该方法用于内部目的:
此API支持.NET Framework基础架构,不打算直接从代码中使用
其次,如果您使用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);
…
即使从所有其他反序列化
方法调用此方法(反序列化(XmlReader,string,XmlDeserializationEvents)
),但这并不意味着控制流必须以反序列化(XmlSerializationReader)
结束
我的建议是:获取
XmlSerializer
的参考源,研究其行为,或者用另一种方式解决问题,或者用调用重写的方式调整外部条件。就我个人而言,我会避免依赖重写该方法。您最终将获得更稳定的行为和防止与框架未来版本的兼容性问题。+1这就是我对reflector的了解-内部流程相当复杂,我也不建议OP在此场景中依赖覆盖。我知道我应该更仔细地阅读MSDN,但在本例中,它看起来非常像一种扩展功能的传统方式——内部方法,它做了很多工作,然后用简化的参数调用反序列化。我被我的假设愚弄了,它必须是它在逻辑上看起来的样子。@Max如果你想要可扩展性-忘记XmlSerializer
。使用……你自己的序列化程序。就我所知,没有其他可行的选择了。。发牢骚。关于XmlSerializer,似乎有很多事情可以更好地实现——例如,如果序列化程序在序列化时将具体类型保存为属性,而不是直接拒绝接口,那么当他们已经完成所有其他工作时,这可能会很方便。无论如何,谢谢+1这就是我与反射器的距离-内部流程相当复杂,我也不建议OP在这种情况下依赖覆盖。我知道我应该更仔细地阅读MSDN,但在本例中,它看起来非常像一种扩展功能的传统方式——内部方法,它做了很多工作,然后用简化的参数调用反序列化。我被我的假设愚弄了,它必须是它在逻辑上看起来的样子。@Max如果你想要可扩展性-忘记XmlSerializer
。使用……你自己的序列化程序。就我所知,没有其他可行的选择了。。发牢骚。关于XmlSerializer,似乎有很多事情可以更好地实现——例如,如果序列化程序在序列化时将具体类型保存为属性,而不是直接拒绝接口,那么当他们已经完成所有其他工作时,这可能会很方便。无论如何,谢谢!