gpt4 book ai didi

c# - 带有 Visual Studio 2008 的 Windows 7 64 位序列化问题

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:56 25 4
gpt4 key购买 nike

有没有人在 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 @ 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);
}
}
}

最佳答案

通过引用传递您的 objModel

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

objModel不会在阅读时被修改,否则。参见 C# Parameters了解更多信息。或者编写两个单独的函数来读取和写入,第一个返回 objModel,第二个将一个作为第一个参数。

添加:

如果您使用的是非 Express Visual Studio,请激活第一次机会异常(exception),我认为一定有一些具有文件访问权限的东西。文件时间戳是否较新`如果不是,则文件未实际保存。

我还将以下代码包含在 try/catch block 中:

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);
}

我希望你会得到一些有用的提示。在您的 got 中,您可能会错过失败的 File.Open

关于c# - 带有 Visual Studio 2008 的 Windows 7 64 位序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3114177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com