Eren Yatkin Ответов: 2

XML сериализация C# я получаю ошибку при десериализации


Здравствуйте, это мои методы сериализации и десериализации в c#. Когда я десериализую объект или что-то еще, я получаю ошибку.

public byte[] Serialize<T>(T ob)
        {
            System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(ob.GetType());
            MemoryStream ms = new MemoryStream();
            xs.Serialize(ms, ob);
            string xmlData = System.Text.Encoding.ASCII.GetString(ms.ToArray(), 0, ms.ToArray().Length);
            return ms.ToArray();
        }

public T XMLDeSerialize<T>(byte[] data)
        {
            string xmlData = System.Text.Encoding.ASCII.GetString(data,0,data.Length);
            System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(T));
            MemoryStream ms = new MemoryStream();
            ms.Write(data, 0, data.Length);
            ms.Position = 0;
            XmlReader rdr = XmlReader.Create(ms);
            ms.Position = 0;
            T t = (T)xs.Deserialize(rdr);
            return t;
        }


Что я уже пробовал:

Я попробовал описанные выше методы и не смог ничего сделать. Я не могу найти никакого решения.

Kschuler

Какую ошибку вы получаете?

Eren Yatkin

Я получал " неожиданную ошибку XML (0,0).... но теперь эти решения работают очень хорошо

Kschuler

Рад, что кто-то тебе помог. Просто не забудьте в следующий раз указать, какую ошибку вы получили. Это значительно облегчает сужение проблемы. :)

2 Ответов

Рейтинг:
6

Eren Yatkin

Я нашел решение.

Я просто удалил

ms.Position = 0
до
T t = (T)xs.Deserialize(rdr);
Это сработало как заклинание.


Рейтинг:
13

Richard Deeming

Во-первых, избавьтесь от этих двух xmlData линии. Вы не используете переменную, поэтому в ней нет необходимости.

Во-вторых, после записи данных в MemoryStream, вам нужно переместить "текущую позицию" обратно в начало потока:

ms.Write(data, 0, data.Length);
ms.Seek(0L, SeekOrigin.Begin);


С этим изменением ваши методы работают идеально:
public byte[] Serialize<T>(T ob)
{
    var xs = new System.Xml.Serialization.XmlSerializer(ob.GetType());
    var ms = new MemoryStream();
    xs.Serialize(ms, ob);
    // string xmlData = System.Text.Encoding.ASCII.GetString(ms.ToArray(), 0, ms.ToArray().Length);
    return ms.ToArray();
}
 
public T DeSerialize<T>(byte[] data)
{
    // string xmlData = System.Text.Encoding.ASCII.GetString(data,0,data.Length);
    var xs = new System.Xml.Serialization.XmlSerializer(typeof(T));
    var ms = new MemoryStream();
    ms.Write(data,0,data.Length);
    ms.Seek(0L, SeekOrigin.Begin); // <-- Add this line
    T t = (T)xs.Deserialize(ms);
    return t;
}


Eren Yatkin

Спасибо за ваш ответ, Ну я обнаружил, что добавил ms.Позиция = 0; дважды. Когда я удалил его, он просто отлично работал.