1

Тема: xml криво серіалізується

прів. я от зара намагаюсь серіалізувати list<myclass>, та іноді воно якось криво зберігається, от вам приклад

<?xml version="1.0" encoding="windows-1251"?>
<ArrayOfMessageBase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <MessageBase xsi:type="MessageConnection" type="NONE" state="-1" waitTime="0">
    <stopChat>false</stopChat>
    <messages />
  </MessageBase>
  <MessageBase xsi:type="MessageAdmin" type="ADMIN_MESSAGE" changeSide="false" side="true">
    <stopChat>false</stopChat>
    <messages>
      <string>Совсем скоро вы сможете связаться со своим протеже</string>
    </messages>
  </MessageBase>
</ArrayOfMessageBase>pe="MessageSystem" type="NONE">
    <stopChat>false</stopChat>
    <messages />
  </MessageBase>

</ArrayOfMessageBase>

частину я видалив, тому що вона не має значення.
Як бачите, під кінець трапилась якась фігня

</ArrayOfMessageBase>pe="MessageSystem" type="NONE">

Чому воно таке стається?

От код серіалізації

private void Serialize(string name, Type type, Type[] extraTypes, object obj)
{
    try {
        var serializer = new XmlSerializer(type, extraTypes);
        using (var fs = new FileStream(GetPathSave() + name, FileMode.OpenOrCreate, FileAccess.Write)) {
            serializer.Serialize(fs, obj);
        }
    }
    catch(XmlException e)
    {
        Debug.LogError("serialization exception, " + name+" Message: "+e.Message);
    }
    catch(System.Exception ex)
    {
        Debug.LogError("exc while ser file '" + name + "': " + ex.Message);
        System.Exception exc = ex.InnerException;
        int i = 0;
        while (exc != null)
        {
            Debug.Log("inner " + i + ": " + exc.Message);
            i++;
            exc = exc.InnerException;
        }
    }
}

2 Востаннє редагувалося leofun01 (02.06.2016 20:34:43)

Re: xml криво серіалізується

Схоже, що в XML-файлі до того були якісь дані, які займали більше пам'яті ніж нові дані. І коли файл відкрився для запису нових даних, серіалізер почав писати нові дані поверх старих.
Перед записом потрібно видаляти все старе з файлу (або дописувати нове в кінець файлу).

FakiNyan написав:
pe="MessageSystem" type="NONE">
    <stopChat>false</stopChat>
    <messages />
  </MessageBase>

</ArrayOfMessageBase>

це залишки з попередніх даних.

Найпростіше замість FileMode.OpenOrCreate використовувати FileMode.Create.
Про різницю між ними можна почитати тут.

Подякували: FakiNyan, Chemist-i2