我想在关闭程序时保存数据并在程序打开时加载数据。 我的结构是这样的
public ref class FormConfig
{
// Connect form
public:
static Int32 Connect_SlaveNo = 0; // + 1 // Axes number
static Int32 Connect_BaudrateNo = 0;
static Int32 Connect_PortNo= 0; // port number
static bool Connect_DemoCheck = false;
static String^ Connect_ConnectInfo = String::Empty;
};
我尝试将我的static 结构数据读/写到二进制文件,但没有成功。 我认为要读/写,需要将静态结构转换为字节数组。我也使用了序列化,但它不能与静态结构一起使用。
我也尝试过单例而不是静态结构,但我遇到了与这个问题 How to do singleton serialization in C#? 相同的问题。
使用Unmanaged C++,一切都像这样非常简单,但它不能在.Net中使用。
struct Medicazos m = {"Bob", "Password", "Feet", 123, 456};
FILE* f = fopen(...);
fwrite(&m, sizeof(struct Medicazos), 1, f);
谁能帮帮我?
最佳答案
嗯...一种方法是不在您的结构中使用static
字段。为什么不创建一个包含结构的单个实例的静态字段呢?还是一开始就避免使用 static?
无论如何,您总是可以编写自己的序列化方法。就这么简单(在 C# 中,因为这是我更流利的,你也注意到 C#):
public class MyClass
{
public static int Field1;
public static int Field2;
public static byte[] SerializeStatics()
{
using (var ms = new MemoryStream())
{
using (var bw = new BinaryWriter(ms))
{
bw.Write(Field1);
bw.Write(Field2);
}
return ms.ToArray();
}
}
}
反向反序列化是相同的 - 在此示例中仅使用 BinaryReader
和 ReadInt32
。
此外,一些序列化器确实支持静态属性,您通常只需将它们标记为显式序列化即可。默认值非常有意义 - 您正在序列化一个实例,包含静态类数据有什么意义?
对于文体注释:同样,这可能只是意味着当 C++/CLI 中有更好的方法或C#。 static
往往在 .NET 中被避免(实际上,许多现代编程方法),主要的异常(exception)是缓存的各种示例。 static
的主要缺点是它有效地扩展了应用程序中每一行代码的状态(以及任何其他可以引用您的应用程序的人),这反过来又是错误的常见来源。您通常希望保持状态尽可能小,而不是依赖于参数和返回值 - 例如,当您开始使用多线程和托管环境时,这尤其有用。
关于c# - 如何在 C++/CLI 或 C# 中将静态结构数据保存到二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35984047/