c# - 如何在 C++/CLI 或 C# 中将静态结构数据保存到二进制文件

标签 c# c++ struct

我想在关闭程序时保存数据并在程序打开时加载数据。 我的结构是这样的

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

反向反序列化是相同的 - 在此示例中仅使用 BinaryReaderReadInt32

此外,一些序列化器确实支持静态属性,您通常只需将它们标记为显式序列化即可。默认值非常有意义 - 您正在序列化一个实例,包含静态类数据有什么意义?

对于文体注释:同样,这可能只是意味着当 C++/CLI 中有更好的方法或C#。 static 往往在 .NET 中被避免(实际上,许多现代编程方法),主要的异常(exception)是缓存的各种示例。 static 的主要缺点是它有效地扩展了应用程序中每一行代码的状态(以及任何其他可以引用您的应用程序的人),这反过来又是错误的常见来源。您通常希望保持状态尽可能小,而不是依赖于参数和返回值 - 例如,当您开始使用多线程和托管环境时,这尤其有用。

关于c# - 如何在 C++/CLI 或 C# 中将静态结构数据保存到二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35984047/

相关文章:

c# - 如何为 TreeView 中的部分而非所有节点设置图像?

c# - Visual Studio WinForm 应用程序应编译并输出到特定目录

c++ - EscapeXML C++ Visual Studio

.net - 结构到字节数组以通过套接字发送

c# - 将我自己的类传递给对象

c# - 任务类无法获取正确的值

c++ - 获取正确的 value_type

c++ - 双向链表 C++ 中的 add 方法问题

c - 如何正确分配新的字符串值?

c - 灵活的数组成员,不必是最后一个