[英]XmlException: Root element is missing. C# Unity
我正在嘗試通過xmlSerializer
將list<clase_A>
從接口發送到統一。
這是我的服務器代碼:
using (connectedTcpClient = tcpListener.AcceptTcpClient())
{
using (NetworkStream stream = connectedTcpClient.GetStream())
{
int length;
XmlSerializer xmls = new XmlSerializer(typeof(List<Clase_comando>));
while ((stream.CanRead && (length = stream.Read(bytes, 0, bytes.Length)) != 0))
{
List<Clase_comando> com = null;
var b = new byte[10000];
com = (List<Clase_comando>)xmls.Deserialize(stream);
//Here i get the problem
}
}
}
下面是 Visual Studio 的代碼:
NetworkStream stream = socketConnection.GetStream();
StreamWriter sw = new StreamWriter(stream);
sw.AutoFlush = true;
XmlSerializer xmls = new XmlSerializer(typeof(List<Clase_A>));
if (stream.CanWrite){
z = My list
byte[] b = new byte[10000];
Stream st = new MemoryStream(b);
xmls.Serialize(st, z);
stream.Write(b, 0, b.Length);
stream.Dispose();
}
問題是當我統一接收接口數據時,它會拋出這個異常:
XmlException: Root element is missing. System.Xml.XmlTextReaderImpl.Throw (System.Exception e) (at <7fd195060d8c41448694ab221d3b56ca>:0) System.Xml.XmlTextReaderImpl.ThrowWithoutLineInfo (System.String res) (at <7fd195060d8c41448694ab221d3b56ca>:0)
Afaik 你不能直接(反)序列化為List<T>
。
您寧願需要一個包裝器 class ,例如
[Serializable]
[XmlRoot]
public class Root
{
[XmlArray]
public List<Clase_comando> Comandos;
}
和
using (NetworkStream stream = connectedTcpClient.GetStream())
{
int length;
XmlSerializer xmls = new XmlSerializer(typeof(Root));
while ((stream.CanRead && (length = stream.Read(bytes, 0, bytes.Length)) != 0))
{
var b = new byte[10000];
List<Clase_comando> com = ((Root)xmls.Deserialize(stream)).Comandos;
}
}
在另一邊相應地
[Serializable]
[XmlRoot]
public class Root
{
[XmlArray]
public List<Clase_A> Comandos;
}
和
XmlSerializer xmls = new XmlSerializer(typeof(Root));
if (stream.CanWrite)
{
var root = new Root(){ Comandos = MyList };
byte[] b = new byte[10000];
using(var st = new MemoryStream(b))
{
xmls.Serialize(st, root);
stream.Write(b, 0, b.Length);
}
}
在智能手機上打字,但我希望這個想法很清楚
在這一行
while ((stream.CanRead && (length = stream.Read(bytes, 0, bytes.Length)) != 0))
數據從stream
讀取到bytes
。
之后,stream 中要么沒有數據,要么根已經丟失。
所以在下一行,序列化程序從損壞的 stream 中讀取:
com = (List<Clase_comando>)xmls.Deserialize(stream);
試試這個代碼:
using (NetworkStream stream = connectedTcpClient.GetStream())
{
var xmls = new XmlSerializer(typeof(List<Clase_comando>));
var com = (List<Clase_comando>)xmls.Deserialize(stream);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.