[英]In C#, why can't I pass a StringReader to a method with a Stream parameter?
在.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;
}
它适用于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来解决它,但我讨厌看到我认为是一个优雅的想法分崩离析。 关于为什么这不起作用的任何想法,和/或使其有效的方法?
这是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);
从技术上讲,(但很明显)因为StringReader
和TextReader
都不是从Stream
派生的。
也许更具信息性, Stream
是表示字节序列的抽象基类。 所有[Something]Reader
和[Something]Writer
类都设计用于读取或写入 Stream
,它们本身不是Stream
对象。 可以说这是真的,但是这些类的命名都很差,并且导致许多开发人员对整个主题的误解。
TextReader也不是流,它直接从MarshalByRefObject继承: http : //msdn.microsoft.com/en-us/library/system.io.textreader.aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.