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。それはnull可能であるため(私は推測しています)、型キャストする必要はなく、それをas-ifyします。

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

もちろん、最後から 2 番目の行をスキップして、ストリームを直接最後の行に入れることもできます。

@JohanLarsson の厚意による (すべてのスウェーデン人、特に私のようにストックホルム出身のスウェーデン人は素晴らしい):ステートメントで宣言
を省略できない場合、または省略したくない場合は、プロパティを参照してください。それに到達します。StreamReaderusingBaseStream

于 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 に答える