0

我无法让DataContractJsonSerializer对象吞下我的流。当我在注释掉的行处于活动状态的情况下执行代码时,我会看到提供的文本(它是一个可解析的 JSON 对象),所以我知道流工作正常。

然而,出于某种原因,编译器抱怨说streamReader我试图把它塞进它的喉咙ReadObject不是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);
}

我正在调整这个例子来处理我的流。我应该从不同的角度来处理它吗?如果是这样 - 如何?

4

3 回答 3

1

你可以试试这个:

using (StreamReader streamReader = new StreamReader(...))
{
  DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(MyThingy));
  MyThingy thingy = (MyThingy) serializer.ReadObject(streamReader.BaseStream);
}
于 2012-12-29T12:34:39.530 回答
1

您正在尝试放入流的阅读器而不是实际的流。跳过using省略号后面隐藏的 和 任何内容(即,当您创建 的实例时作为参数输入的任何内容StreamReader),您可能可以将其放入ReadObject.

此外,您在读取数据时会遇到问题,因为ReadObject将返回一个类型的实例,Object您需要将其转换为MyThingy. 由于它是可空的(我假设),因此您不必键入 cast 而是 as-ify 它。

MyThingy thingy = new MyThingy();
DataContractJsonSerializer serializer 
  = new DataContractJsonSerializer(thingy.GetType());
Stream stream = ...;
thingy = serializer.ReadObject(stream) as MyThingy;

您当然可以跳过倒数第二行并将流直接放入最后一行。

感谢@JohanLarsson(所有瑞典人都很棒,尤其是像我一样来自斯德哥尔摩的人):
如果您不能或不想StreamReader在您的声明中省略using声明,我建议您查看一下BaseStream属性得到它。

于 2012-12-29T12:35:11.433 回答
1

我一直在使用这个:

 // 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);
 }   
于 2012-12-29T12:47:53.710 回答