Как я могу сериализовать XML в поток памяти и получить те же результаты, как если бы я сериализовал в поток файлов? - PullRequest
1 голос
/ 09 ноября 2010

Я работаю над приложением, которое хранит свои документы в XML с использованием сериализации / десериализации C #.

Когда пользователь хочет выполнить запуск в приложении, нам нужно предложить пользователю сохранитьдокумент, если он изменился.(А также, когда пользователь пытается закрыть документ.)

Мы оцениваем, изменился ли документ, сравнивая объект в памяти с файлом документа на диске.Объект в памяти XML сериализован в MemoryStream, и его сравнивают с потоком для файла на диске.

Моя проблема в том, что файлы идентичны, кроме заголовка XML.Файл на диске начинается с

<?xml version="1.0"?>

, тогда как MemoryStream (при записи в файл на диске) начинается с

"<?xml version="1.0" encoding="utf-8"?>"

Так что, конечно, два потока не сравнить.Что я делаю неправильно?Как я могу получить одинаковые результаты независимо от того, какой поток я использую?

Изучив эту проблему некоторое время назад, у меня сложилось впечатление, что это может быть связано с форматами потокового кодирования, ичто в C # MemoryStream использует другой формат кодировки по умолчанию для строк.(Или что-то еще.)

Код, который сериализуется в файл:

    /// <summary>
    /// Serialises the workspace.
    /// </summary>
    /// <param name="stream">
    /// The stream to serialise to.
    /// </param>
    private void Serialise(Stream stream)
    {
        stream.Seek(0, SeekOrigin.Begin);
        DeflateStream compressingStream = new DeflateStream(stream, CompressionMode.Compress, true);
        BufferedStream bufferedStream = new BufferedStream(compressingStream, 65536);
        new XmlSerializer(typeof(Workspace)).Serialize(bufferedStream, this);
        bufferedStream.Close();
        compressingStream.Close();
    }

Код, который сериализуется в память:

    /// <summary>
    /// Checks whether an object has changed since last save.
    /// </summary>
    /// <param name="storagePath">The path of the object.</param>
    /// <param name="current">The current memory version of the object.</param>
    /// <returns>Whether the object has changed since last save.</returns>
    private static bool HasObjectChanged(string storagePath, object current)
    {
        Stream streamCurr = new MemoryStream();
        DeflateStream compressingStream = new DeflateStream(streamCurr, CompressionMode.Compress, true);

...
        new XmlSerializer(current.GetType()).Serialize(compressingStream, current);

Спасибо за любыепомощь,
Люк.

1 Ответ

2 голосов
/ 09 ноября 2010

Попробуйте использовать StreamWriter:

...
StreamWriter writer = new StreamWriter(bufferedStream);
new XmlSerializer(typeof(Workspace)).Serialize(writer, this);
writer.Close();
...

И

...
StreamWriter writer = new StreamWriter(compressingStream);
new XmlSerializer(current.GetType()).Serialize(writer, current);
writer.Close();
...
...