2

クラスを作成し、それをxmlに変換しています。

問題は、クラス xml 文字列をバイトに変換する
と 、先頭に余分な文字がASCII.GetBytesあるバイト配列が返されることです。
ascArray

それは常にですか?文字なので、xmlは次のように始まります

?<?xml version="1.0" encoding="utf-8"?>

なぜこうなった?

これはコードです:

  WorkItem p = new WorkItem();

  // Fill the class with whatever need to be sent to client
  OneItem posts1 = new OneItem();
  posts1.id = "id 1";
  posts1.username = "hasse";
  posts1.message = "hej again";
  posts1.time = "time1";
  p.setPost(posts1);

  OneItem posts2 = new OneItem();
  posts2.id = "id 2";
  posts2.username = "bella";
  posts2.message = "hej again again";
  posts2.time = "time2";
  p.setPost(posts2);

  // convert the class WorkItem to xml
  MemoryStream memoryStream = new MemoryStream();
  XmlSerializer xs = new XmlSerializer(typeof(WorkItem));
  XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
  xs.Serialize(xmlTextWriter, p);

  // send the xml version of WorkItem to client
  byte[] data = memoryStream.ToArray();
  clientStream.Write(data, 0, data.Length);
  Console.WriteLine(" send.." + data);
  clientStream.Close();
4

1 に答える 1

4

データがASCII で表現できないバイト オーダー マークで始まるのではないかと強く疑っています。

そもそも何をしているのか、特にMemoryStream. UTF-8 でエンコードされたバイト配列を作成し、それを文字列にデコードして (何をするかわかりませんUTF8ByteArrayToString)、それをバイト配列に戻すのはなぜですか? まず、バイト配列をクライアントに直接書き込んでみませんか? データを文字列として必要な場合はStringWriter、エンコーディングとして UTF-8 を使用することをアドバタイズするサブクラスを使用します。文字列として必要ない場合は、バイト配列に固執してください。

この最初の文字以外にも、UTF-8 でエンコードされた XML ドキュメントを取得したという事実は、文字列に他の非 ASCII 文字が含まれている可能性があることを意味します。なぜここでASCIIを使用しているのですか?

編集:明確にするために、基本的に損失のある変換を適用しており、不必要に行っています。データのローカル コピーが必要な場合でも、次のようなものが必要です。

// Removed bad try/catch block - don't just catch Exception, and don't
// just swallow exceptions
MemoryStream memoryStream = new MemoryStream();
XmlSerializer xs = new XmlSerializer(typeof(WorkItem));
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
xs.Serialize(xmlTextWriter, p);

// Removed pointless conversion to/from string
// Removed pointless BinaryWriter (just use the stream)

// An alternative would be memoryStream.WriteTo(clientStream);
byte[] data = memoryStream.ToArray();
clientStream.Write(data, 0, data.Length);
Console.WriteLine(" send.." + data);

// Removed Close calls - you should use "using" statements to dispose of
// streams automatically.
于 2012-06-14T05:47:15.770 に答える