2011-03-06 22 views
1

私の心がゆっくりと流れている間に、私はゆっくりとエッジを擦っています。オーバーライド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; 
    } 
} 

そして、このようにそれを使用します。私は私のデシリアライズのオーバーライドにブレークポイントを置けば

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); 
    } 

をしかし、それがヒットされることはありません!たとえ私が意図的に例外を投げたとしても、プログラムの機能は正常なので、絶対にヒットしないと確信しています。

なぜ私は内部のメソッドをオーバーライドさせるのですか?私はそれによって何かに影響を与えることなく、デシリアライズしますか?

私は間違っていますか?

敬具、マックス

答えて

5

まず、MSDNは、この方法は、内部目的のために意図され言うように:

このAPIは、.NET Frameworkインフラストラクチャをサポートします。コードから直接使用するためのものではありません。

第2に、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(XmlSerializationReader)で終わる必要がありますという意味ではありません、他のすべてのDeserializeメソッドから呼び出されていますが。

私の助言:XmlSerializerの参照元を取得し、その動作を研究し、別の方法で問題を解決するか、オーバーライドが呼び出されるような方法で外部条件を調整してください。個人的には、は、のメソッドをオーバーライドしないでください。あなたはより安定した動作に終わるでしょうは、互換性の問題フレームワークの将来のバージョンとの互換性の問題を防止します。

+0

+1リフレクターでどれくらいの距離をとっているのですか?内部の流れは非常に複雑です。私はこのシナリオでオーバーライドに頼るようOPにアドバイスしません。 – BrokenGlass

+0

ありがとう。私はMSDNをもっとよく読んでいなければならないことを知っていましたが、この場合、機能を拡張する従来の方法によく似ていました。つまり、配管を大量に行う内部メソッドで、単純化された引数でDeserializeを呼び出しました。私は論理的に見えるものでなければならないという私の前提にだまされました。 – Max

+2

@Max拡張性が必要な場合は、** 'XmlSerializer'について**忘れてしまいます。そして、あなたのシリアライザを使用してください。私の知る限り、他に実行可能な選択肢はありません。 –

関連する問題