2013-07-01 3 views
1

Я тестирую отправку сложного объекта сообщения через службу WCF и получаю различные ошибки сериализации. Для того чтобы упростить вещи, которые я пытаюсь сократить его просто тестирует DataContractSerializer, для которого я написал следующий тест основан на коде here:Тестирование DataContractSerializer со строкой

Dim message As TLAMessage = MockFactory.GetMessage 
Dim dcs As DataContractSerializer = New DataContractSerializer(GetType(TLAMessage)) 
Dim xml As String = String.Empty 

Using stream As New StringWriter(), writer As XmlWriter = XmlWriter.Create(stream) 
    dcs.WriteObject(writer, message) 
    xml = stream.ToString 
End Using 

Debug.Print(xml) 

Dim newMessage As TLAMessage 
Dim sr As New StringReader(xml) 
Dim reader As XmlReader = XmlReader.Create(sr) 
dcs = New DataContractSerializer(GetType(TLAMessage)) 
newMessage = CType(dcs.ReadObject(reader, True), TLAMessage) 'Error here 
reader.Close() 
sr.Close() 

Assert.IsTrue(newMessage IsNot Nothing) 

Однако это получает необычную ошибку у себя на вызов ReadObject: Unexpected end of file while parsing Name has occurred. Line 1, position 6144

Это ошибка буферизации, но я не вижу, как «ReadToEnd» в строке. Я пробовал использовать MemoryStream: Dim ms As New MemoryStream(Encoding.UTF8.GetBytes(xml)) и StreamWriter, но каждый из них пришел с собственными ошибками или несовместим с методом ReadObjectDataContractSerializer, который принимает множество различных перегрузок.

Обратите внимание, что адаптация кода со страницы MSDN отлично работает, но требует сериализации в файл, однако я хотел бы сериализовать строку и из строки, но я думаю, что мне не хватает чего-то жизненно важного.

Я пропустил что-то очевидное в коде выше?

ответ

4

Данные из вашего XmlWriter не сразу заселяются в базовый StringWriter. Поэтому вы должны очистить писателя после написания:

dcs.WriteObject(writer, message) 
writer.Flush() 
xml = stream.ToString() 
+0

Так очевидно, и я все время искал не то место. Спасибо –

+0

Добро пожаловать. –

Смежные вопросы