Max*_*Max 1 c# extend xmlserializer
我慢慢地感觉到我的理智在边缘磨损,而我的思绪慢慢消失.
我想扩展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;
}
}
Run Code Online (Sandbox Code Playgroud)
并以这种方式使用它:
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);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我在我的Deserialize覆盖中放置一个断点,它永远不会被击中!即使我故意在那里抛出异常,程序功能也是正常的,所以我相信它永远不会被击中.
为什么他们会让我覆盖一个内部方法Deserialize而不会让我影响它的任何东西?
我究竟做错了什么?
最好的问候,马克斯
首先,正如MSDN所说,该方法仅用于内部目的:
此API支持.NET Framework基础结构,不能直接在您的代码中使用.
其次,如果你看一下XmlSerializerReflector,你会发现调用这个方法的唯一地方.简化的控制流程是:
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);
…
Run Code Online (Sandbox Code Playgroud)
即使Deserialize(XmlReader, string, XmlDeserializationEvents)从所有其他Deserialize方法调用此方法(),也不意味着控制流必须最终进入Deserialize(XmlSerializationReader).
我的建议:获取参考源XmlSerializer,研究行为,或者以另一种方式解决问题,或者以调用覆盖的方式调整外部条件.就个人而言,我会避免依赖于覆盖该方法.您将获得更稳定的行为,并防止与框架的未来版本的兼容性问题.
| 归档时间: |
|
| 查看次数: |
1641 次 |
| 最近记录: |