在C#中,为什么我不能将StringReader传递给带有Stream参数的方法?

Pat*_*hes 4 .net c# xml

在.net 4和C#中.我已经实现了一个静态方法来将XML流反序列化为对象.这只是一个xml格式进入一个对象,所以我不想做任何花哨的事情.由于我可以通过各种方式获取此XML内容,因此我认为我将传递给静态方法的参数作为Stream对象.我认为它会接受从基类Stream派生的任何对象 - 如FileStream,MemoryStream,StringReader等.

当我传递一个FileStream对象时它工作正常,但是当我传递一个StringReader时它没有.

我的静态方法:

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

        return mObj;
    }
Run Code Online (Sandbox Code Playgroud)

它适用于FileStream:

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

            fs.Close();
        }
Run Code Online (Sandbox Code Playgroud)

但不是StringReader:

StringReader sr = new StringReader(Request.Form["mXML"]);
MatchObj objReply = MStatic.DeserializeMatch(sr);
Run Code Online (Sandbox Code Playgroud)

构建错误是:"无法从'System.IO.StringReader'转换为'System.IO.Stream'"

哪个本身有意义,但我认为既然StringReader实现了TextReader,它算作Stream?XML Deserializer可以正常工作.

我只是通过重载该方法来使用StringReader来解决它,但我讨厌看到我认为是一个优雅的想法分崩离析.关于为什么这不起作用的任何想法,和/或使其有效的方法?

Bri*_*ian 7

这是StringReader的继承层次结构......

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

我建议将Request.Form ["mXML"]放入MemoryStream中.

这可能有用(未经测试)......

var xmlBytes = Encoding.UTF8.GetBytes(Request.Form["mXML"]);
var ms = new MemoryStream(xmlBytes);
var reply = MStatic.DeserializeMatch(ms);
Run Code Online (Sandbox Code Playgroud)

  • +1.我建议`var ms = new MemoryStream(Encoding.UTF8.GetBytes(sr.ReadToEnd()));`或者用`var ms = new MemoryStream(Encoding.UTF8.GetBytes(Request.Form [ "MXML"]));` (3认同)