2014-01-15 3 views
-1

Я запускаю сервер на хост-машине и клиенте с моего компьютера. Я сериализую xml, который я хочу отправить и отправить на сервер через TCP-соединение. На сервере я получаю xml и пытаюсь десериализовать его. Тем не менее, я получаю эту ошибку:Deserializing XML Over Tcp connection

There is an error in XML document (1, 1). 

Я посмотрел на исключение, и я получил это внутреннее исключение: код

Data at the root level is invalid. Line 1, position 1. 

Client сериализовать и отправить XML:

XmlSerializer xs = new XmlSerializer(typeof(BalanceInquiryReqType)); 
BalanceInquiryReqType req = new BalanceInquiryReqType(); 
req.loyaltyToken = "416600000003"; 
req.storeID = 400020; 
req.transactionDateTime = DateTime.Now; 
req.transactionID = "123"; 
using (TextWriter writer = new StringWriter(send)) 
{ 
    xs.Serialize(writer, req); 
} 

Код сервера для десериализации xml:

byte[] buffer = new byte[512]; 
int bytesread = handler.Receive(buffer, SocketFlags.None); 
String received = BitConverter.ToString(buffer);  
XmlSerializer xs = new XmlSerializer(typeof(BalanceInquiryReqType)); 
BalanceInquiryReqType request = new BalanceInquiryReqType(); 
using (TextReader txt = new StringReader(received)) 
{ 
    request = (TransReqType)xs.Deserialize(txt); 
} 

XML-я послал:

<?xml version="1.0" encoding="utf-16"?> 
    <BalanceInquiryReqType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <loyaltyToken>416600000003</loyaltyToken> 
     <storeID>400020</storeID> 
     <transactionDateTime>2014-01-15T14:40:02.4960937-05:00</transactionDateTime> 
     <transactionID>123</transactionID> 
    </BalanceInquiryReqType> 

схему XML, которую я послал:

<xs:complexType name="BalanceInquiryReqType"> 
    <xs:complexContent> 
     <xs:extension base="TransReqType" /> 
    </xs:complexContent> 
</xs:complexType> 

Основание расширение:

<xs:complexType name="TransReqType"> 
    <xs:sequence> 
     <xs:element minOccurs="1" maxOccurs="1" name="loyaltyToken" type="xs:string" /> 
     <xs:element minOccurs="1" maxOccurs="1" name="storeID" type="xs:long" /> 
     <xs:element minOccurs="1" maxOccurs="1" name="transactionDateTime" type="xs:dateTime" /> 
     <xs:element minOccurs="1" maxOccurs="1" name="transactionID" type="xs:string" /> 
     <xs:element minOccurs="0" maxOccurs="1" name="cashierID" type="xs:string" /> 
     <xs:element minOccurs="0" maxOccurs="1" name="stan" type="xs:string" /> 
     <xs:element minOccurs="0" maxOccurs="1" name="terminalID" type="xs:string" /> 
</xs:sequence></xs:complexType> 

Кто-нибудь есть какие-нибудь идеи, что это может быть? Я пробовал варианты читателей, например, используя MemoryStream, но я постоянно сталкивался с различными проблемами.

+0

Ну, напишите XML, полученный сервером, в файл и посмотрите на него. Что ты видишь? (Не смотрите на отправляемый XML, но посмотрите на полученный XML-сервер!) – elgonzo

+1

Просто отлаживайте свой код. По крайней мере, поместите Debug.Write здесь 'String received = BitConverter.ToString (buffer);' И прочитайте документы о * BitConverter.ToString *. 'received' ** не ** xml. –

+0

Как вы пишете XML-документ в сокет? Я полагаю, 'send' является StringBuilder; если нет, то какой это тип? Вы пытались использовать 'Encoding.UTF8.GetString (buffer)' (или другое кодирование) вместо 'BitConverter.GetString (buffer)'? – Markus

ответ

0

Используйте System.Text.Encoding, чтобы выбрать кодировку и использовать ее вместо BitConverter. Это то, что вы хотите здесь. Затем вызовите GetBytes на клиенте и GetString на сервере.