【问题标题】:JsonSerializer can't read stream from StreamReaderJsonSerializer 无法从 StreamReader 读取流
【发布时间】:2012-12-14 10:18:33
【问题描述】:

我无法让 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);
}

我正在调整 this example 以使用 my 流。我应该从不同的角度来处理它吗?如果是这样 - 如何?

【问题讨论】:

    标签: c# json stream streamreader


    【解决方案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);
     }   
    

    【讨论】:

      【解决方案2】:

      您正在尝试放入流的阅读器,而不是实际的流。跳过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(所有瑞典人都很棒,尤其是像我一样来自斯德哥尔摩的瑞典人):
      如果您不能或不想在您的 using 语句中省略 StreamReader 声明,我建议您查看 BaseStream 属性以了解它。

      【讨论】:

        【解决方案3】:

        你可以试试这个:

        using (StreamReader streamReader = new StreamReader(...))
        {
          DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(MyThingy));
          MyThingy thingy = (MyThingy) serializer.ReadObject(streamReader.BaseStream);
        }
        

        【讨论】:

        • 是否有必要创建流的读取器只是为了将流从流中取出?是否出于某种原因建议?
        • @KonradViltersten 不,我不认为我赞成您的回答,本来打算将其添加到我的帖子中,但您之前回答过。我会留下我的,直到有人说这是完全错误的:)
        • 我认为没有错。事实上,我什至没有想过使用BaseStream,所以我认为它在这里很好,你绝对应该把它留在这里(直到,正如你所说,有人切肉刀出现并抨击我们俩)。 +1 为您提供创意。另外,我在扯掉你的暗示。 :)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-29
        相关资源
        最近更新 更多