2010-06-24 45 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

相關問題