Вы видите метку порядка байтов (BOM), которая часто используется в начале текстовых файлов или потоков для указания порядка байтов и варианта Unicode.
Ваш сериализатор очень странный.Если вы кодируете строку с некоторой кодировкой, такой как UTF-8, вы должны вернуть ее в виде массива байтов.Сначала кодируя XML-код в UTF-8, а затем декодируя поток UTF-8 обратно в строку, вы ничего не получите (кроме введения проблемной спецификации).
Либо используйте только UTF-16, либо вернитебайтовый массив.Теперь, когда эта функция работает, кодирование просто создает проблемы.
Обновление:
На основе кода, приведенного в комментарии ниже, я увижу два подхода:
Подход 1: Создать строку с сериализованными данными и преобразовать ее в UTF-8 позднее
Public Shared Function SerializeObject(ByVal obj As Object) As String
Dim serializer As New XmlSerializer(obj.GetType)
Using strWriter As New IO.StringWriter()
serializer.Serialize(strWriter, obj)
Return strWriter.ToString
End Using
End Function
....
Dim serialisedObject As String = SerializeObject(object)
Dim postData As Byte() = New Text.UTF8Encoding(True).GetBytes(serialisedObject)
Если вам нужна другая кодировка, измените последнюю строку.Если вы хотите опустить метку порядка байтов, передайте False
в UTF8Encoding()
.
Подход 2. Сначала создайте правильно закодированные данные и продолжайте с байтовым массивом
Public Shared Function SerializeObject(ByVal obj As Object, ByVal encoding As Text.Encoding) As Byte()
Dim serializer As New XmlSerializer(obj.GetType)
If encoding Is Nothing Then
Set encoding = Encoding.Unicode
End If
Using stream As New IO.MemoryStream, xtWriter As New Xml.XmlTextWriter(stream, encoding)
serializer.Serialize(xtWriter, obj)
Return stream.ToArray()
End Using
End Function
....
Dim postData As Byte() = SerializeObject(object)
В этом случае XmlTextWriter
непосредственно кодирует данные с правильной кодировкой.Поскольку у нас уже есть байтовый массив, последний шаг короче: у нас есть данные для отправки клиенту.