在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);
}
}
}
起初,我認爲這可以解決問題。我寫了兩個單獨的方法[void Serialize(Model obj)和Model Deserialize()],但這沒有幫助。進一步分析:如果我聲明Model obj = new Model(),則所有參數都初始化爲0,但Deserialize會返回帶有數據的Model實例。我可以更改數據,並調用Serialize(obj),並且沒有錯誤。 我應該使用最新的代碼更新我的帖子......我現在要做。 – jp2code 2010-06-25 13:53:23
我添加了一些提示,希望可以幫助您...祝您好運。 – jdehaan 2010-06-25 15:28:48