我无法让 DataContractJsonSerializer
对象吞下我的流。当我执行带有注释掉的行的代码时,我会看到提供的文本(并且它是一个可解析的JSON对象),所以我知道流工作正常。
但是,出于某种原因,编译器抱怨 streamReader
我试图在 ReadObject
中sh is is是 Stream
。好吧,不是吗?!
参数1:无法从'System.IO.StreamReader'转换为'System.IO.Stream'
我缺少什么,如何解决?
using (StreamReader streamReader = new StreamReader(...))
{
//String responseText = reader.ReadToEnd();
MyThingy thingy = new MyThingy();
DataContractJsonSerializer serializer
= new DataContractJsonSerializer(thingy.GetType());
thingy = serializer.ReadObject(streamReader);
}
我正在调整this example以使用我的流。我应该从不同的角度来看待它吗?如果是这样 - 怎么样?
答案 0 :(得分:1)
你可以试试这个:
using (StreamReader streamReader = new StreamReader(...))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(MyThingy));
MyThingy thingy = (MyThingy) serializer.ReadObject(streamReader.BaseStream);
}
答案 1 :(得分:1)
您尝试输入流的读者而不是实际的流。跳过using
以及省略号后面的任何隐藏(即,当您创建StreamReader
的实例时,无论您将其作为参数放入什么内容),您都可以将其放入ReadObject
。
此外,您在阅读数据时会遇到问题,因为ReadObject
会返回Object
类型的实例,您需要将其转换为MyThingy
。因为它是可以为空的(我在假设),所以你不必输入强制转换,而是将其视为as-ify。
MyThingy thingy = new MyThingy();
DataContractJsonSerializer serializer
= new DataContractJsonSerializer(thingy.GetType());
Stream stream = ...;
thingy = serializer.ReadObject(stream) as MyThingy;
您当然可以跳过倒数第二行并将流直接放入最后一行。
由@JohanLarsson提供(所有瑞典人都很棒,特别是来自斯德哥尔摩的人,像我一样):
如果您不能或不想在StreamReader
声明中省略using
声明,我建议您查看BaseStream
属性以获取它。
答案 2 :(得分:0)
我一直在使用这个:
// get stuff here
String json = GetJSON();
List<T> result;
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
var serializer = new DataContractJsonSerializer(typeof(List<T>));
result = (List<T>)serializer.ReadObject(ms);
}