在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