2010-12-08 16 views
4

.net 4とC#で。 XMLストリームをオブジェクトに逆シリアル化する静的メソッドを実装しました。これは、1つのオブジェクトに入るXMLフォーマットの1つのみです。そのため、私はそれを気にすることは何もしていません。私はこのXMLコンテンツをさまざまな方法で取得できるので、静的メソッドに渡されるパラメータをStreamオブジェクトにしたいと考えました。私はそれから、FileStream、MemoryStream、StringReaderなどの基本クラスStreamから派生したオブジェクトを取得すると思っていました。C#では、StreamReaderをStreamパラメータを持つメソッドに渡すことができないのはなぜですか?

FileStreamオブジェクトを渡すとうまく動作しますが、 。

私の静的メソッド:

public static MatchObj DeserializeMatch(Stream srXml) 
    { 
     XmlSerializer xs = new XmlSerializer(typeof(MatchObj)); 
     MatchObj mObj = (MatchObj)xs.Deserialize(srXml); 

     return mObj; 
    } 

それは、FileStreamをして動作します。

 MatchObj objReply; 
     using (FileStream fs = new FileStream(Server.MapPath("/App_Data/Match.xml"), FileMode.Open)) 
     { 
      objReply = MStatic.DeserializeMatch(fs); 

      fs.Close(); 
     } 

でもないにStringReader:

StringReader sr = new StringReader(Request.Form["mXML"]); 
MatchObj objReply = MStatic.DeserializeMatch(sr); 

ビルドエラーがある:「"から変換することはできませんSystem.IO.StringReader 'から' System.IO.Stream '""

それ自体は意味がありますが、StringReaderがTextReaderを実装して以来、Streamとしてカウントされていると思いましたか? XML Deserializerはいずれかでうまく動作します。

私は単純にそのメソッドをオーバーロードしてStringReaderを取りますが、私はエレガントなアイデアが崩れていると思っていたのを見逃しています。なぜこれがうまくいかないか、そして/またはそれを動作させる方法に関するアイデア?ここで

+0

これは私からnoobishと聞こえるかもしれません....しかし、あなたはどんな種類のStreamからもStringReaderを継承していますか? – Machinarius

答えて

7

はにStringReaderの継承階層は、私が代わりのMemoryStreamにあるRequest.Form [ "MXMLを"]置くことを示唆している...

 
System.Object 
    System.MarshalByRefObject 
    System.IO.TextReader 
     System.IO.StringReader 

です。

これは、(未テスト)うまくいくかもしれない...

var xmlBytes = Encoding.UTF8.GetBytes(Request.Form["mXML"]); 
var ms = new MemoryStream(xmlBytes); 
var reply = MStatic.DeserializeMatch(ms); 
+3

+1。私は 'var ms = new MemoryStream(Encoding.UTF8.GetBytes(sr.ReadToEnd()));'を提案するか、文字列読み取り機を 'var ms = new MemoryStream(Encoding.UTF8.GetBytes(Request.Form [ "mXML"]))); – Ani

+0

私はTextReaderがStreamから継承したことを頭の中で抱いていたと思います。私がそれに固執していたことの1つは、XmlSerializerでした。デシリアライザもいずれかで正常に動作しました。私はそのメソッドが単純にオーバーロードされていることを理解しています。ストリームのほかに、TextReaderまたはXmlReaderも使用できます。 – Patches

+1

@Ani - あなたの提案を試してみました。私はしました:MatchObj objReply = MStatic.DeserializeMatch(新しいMemoryStream(Encoding.UTF8.GetBytes(Request.Form ["mXML"])))); – Patches

1

たTextReaderは、どちらかのストリームではない、それはMarshalByRefObjectから直接継承:http://msdn.microsoft.com/en-us/library/system.io.textreader.aspx

+0

-1:それは何と関係がありますか? –

+0

ストリームからデリバリーされません。 – dthorpe

+0

OPは "それ自体は意味がありますが、StringReaderがTextReaderを実装して以来、Streamとしてカウントされていると思いましたか? – dthorpe

4

まあ、技術的には、(しかし、明らかに)StringReaderでもないので、 TextReaderStreamから派生したものでもありません。
多分、より具体的には、Streamは、バイトのシーケンスを表す抽象基本クラスです。すべての[Something]Reader[Something]Writerクラスはに設計されていますがに/ Streamから、彼らは自身がStreamオブジェクトではありませんまたは書き込みを読んで。しかし、これらのクラスはすべて非常に不十分な名前であり、多くの開発者がこの全体の話題について持っている誤解につながることは間違いありません。

+0

あなたはそれについて正しいと思います。ストリームに読み書きすることができるものがStreamの基底クラスを実装することは、わかりやすいだけです。しかし、私はそうは思わない! – Patches

関連する問題