2010-06-24 61 views
2

在Visual Studio 2008下,有没有人遇到在Windows 7 64位序列化上的问题?使用Visual Studio 2008在Windows 7 64位上的序列化问题

我可以在没有错误退出之前对我的对象进行序列化,但是当我打开对象备份时,我更改的数据不存在。

我知道的唯一区别是我在Windows 7 64位(以前是Win XP 32位)。

我的代码如下工作正常,没有任何异常被触发。不过,如果我更改对象数据的值并对其进行序列化,那么当我返回并反序列化同一数据时,它不会恢复。

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 @上午09点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

按引用传递您的objModel

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

objModel不会阅读,否则进行修改。有关更多信息,请参阅C# Parameters。或者写两个独立的函数来读写,第一个返回objModel第二个有一个作为第一个参数。

新增:

如果您使用的是非快速的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

+0

起初,我认为这可以解决问题。我写了两个单独的方法[void Serialize(Model obj)和Model Deserialize()],但这没有帮助。进一步分析:如果我声明Model obj = new Model(),则所有参数都初始化为0,但Deserialize会返回带有数据的Model实例。我可以更改数据,并调用Serialize(obj),并且没有错误。 我应该使用最新的代码更新我的帖子......我现在要做。 – jp2code 2010-06-25 13:53:23

+0

我添加了一些提示,希望可以帮助您...祝您好运。 – jdehaan 2010-06-25 15:28:48

相关问题