Я работаю над приложением, которое хранит свои документы в 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);
Спасибо за любыепомощь,
Люк.