Проблемы сериализации в Windows 7 64-разрядных с Visual Studio 2008 - PullRequest
2 голосов
/ 25 июня 2010

Кто-нибудь испытывал проблемы с сериализацией в 64-битной Windows 7 под Visual Studio 2008?

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

Единственное различие, которое я знаю, в том, что я нахожусь на 64-битной Windows 7 (предыдущая была 32-битная Win XP).

Мой код ниже работает нормально, и ни один изисключения срабатывают.Тем не менее, если я изменю значение данных моего объекта и сериализую его, он не будет возвращаться обратно, когда я вернусь и десериализую эти же данные.

static void Settings(object objModel, StoreOption value) {
  Model obj = objModel as Model;
  if (obj == null) return;
  if (!Directory.Exists(ExePath)) {
    Directory.CreateDirectory(ExePath);
  }
  string cfgFile = Path.Combine(ExePath, _CFG_FILE);
  bool ok = File.Exists(cfgFile);
  switch (value) {
    case StoreOption.Load:
      if (ok) {
        try {
          using (Stream stream = File.Open(cfgFile, FileMode.Open, FileAccess.Read)) {
            IFormatter formatter = new BinaryFormatter();
            obj = formatter.Deserialize(stream) as Model;
          }
        } catch (SerializationException err) {
          Console.WriteLine(err);
          obj = null;
        }
      }
      break;
    case StoreOption.Save:
      if (ok) {
        try {
          File.Delete(cfgFile);
        } catch (Exception err) {
          Console.WriteLine(err);
        }
      }
      if (obj == null) {
        obj = new Model();
      }
      using (Stream stream = File.Open(cfgFile, FileMode.Create, FileAccess.Write)) {
        try {
          IFormatter formatter = new BinaryFormatter();
          formatter.Serialize(stream, obj);
        } catch (SerializationException err) {
          Console.WriteLine(err);
        }
      }
      break;
  }
}

Редактировать (06 /25/2010 @ 9 AM CST): Используя предложение jdehaan , я разделил метод static void Settings(object objModel, StoreOption value); на следующие два метода.

Эта процедура все еще не в состоянии вспомнить изменения, которые я делаю в объекте.Я могу изменить данные, отправленные на Serialize, и ошибок нет.Правильно ли сериализованы данные в моем файле?Я не знаю, потому что я не знаю, как интерпретировать данные в текстовом средстве просмотра, таком как Блокнот.Однако всякий раз, когда я вспоминаю сохраненные данные методом Deserialize, возвращаемые данные НЕ являются тем, что я сохранил!

static Model Deserialize() {
  Model obj;
  if (!Directory.Exists(ExePath)) {
    Directory.CreateDirectory(ExePath);
  }
  string cfgFile = Path.Combine(ExePath, _CFG_FILE);
  bool ok = File.Exists(cfgFile);
  if (ok) {
    try {
      using (Stream stream = File.Open(cfgFile, FileMode.Open, FileAccess.Read)) {
        IFormatter formatter = new BinaryFormatter();
        obj = formatter.Deserialize(stream) as Model;
      }
    } catch (SerializationException err) {
      Console.WriteLine(err);
      obj = null;
    }
  } else {
    obj = null;
  }
  return obj;
}


static void Serialize(Model obj) {
  if (obj == null) return;
  if (!Directory.Exists(ExePath)) {
    Directory.CreateDirectory(ExePath);
  }
  string cfgFile = Path.Combine(ExePath, _CFG_FILE);
  bool ok = File.Exists(cfgFile);
  if (ok) {
    try {
      File.Delete(cfgFile);
    } catch (Exception err) {
      Console.WriteLine(err);
    }
  }
  if (obj == null) {
    obj = new Model();
  }
  using (Stream stream = File.Open(cfgFile, FileMode.Create, FileAccess.Write)) {
    try {
      IFormatter formatter = new BinaryFormatter();
      formatter.Serialize(stream, obj);
    } catch (SerializationException err) {
      Console.WriteLine(err);
    }
  }
}

1 Ответ

1 голос
/ 25 июня 2010

Передайте вашу objModel по ссылке

static void Settings(ref object objModel, StoreOption value) { ... }

objModel не будет изменено при чтении в противном случае.См. C # Параметры для получения дополнительной информации.Также можно написать две отдельные функции для чтения и записи: первая возвращает objModel, вторая имеет одну в качестве первого параметра.

ДОБАВЛЕНО:

Если вы используете NON Express Visual Studio, активируйтеПервые шансы исключения, я думаю, должно быть что-то с правами доступа к файлу.Является ли временная метка файла более новой? Если бы файл не был фактически сохранен.

Я бы также заключил следующий код в блок try / catch:

try {
    using (Stream stream = File.Open(cfgFile, FileMode.Create, FileAccess.Write)) {
        try {
          IFormatter formatter = new BinaryFormatter();
          formatter.Serialize(stream, obj);
        } catch (SerializationException err) {
          Console.WriteLine(err);
        }
    }
}
catch (Exception ex)
{
    Console.WriteLine("Exception: {0}", ex);
}

Я надеюсь, что тогда выполучить полезные советыВ вашем распоряжении вы можете пропустить неисправный File.Open.

...