【问题标题】:Serialize a structure in C# to C++ and vice versa将 C# 中的结构序列化为 C++,反之亦然
【发布时间】:2010-11-16 19:33:41
【问题描述】:

有没有一种简单的方法来序列化 C# 结构,然后从 c++ 反序列化它。 我知道我们可以将 csharp 结构序列化为 xml 数据,但我必须在 c++ 中实现 xml 反序列化器。

C# 中的哪种序列化程序最容易从 C++ 反序列化? 我希望两个应用程序(一个 C++ 和另一个 csharp )能够使用数据结构进行通信

【问题讨论】:

    标签: c# c++ serialization


    【解决方案1】:

    这是我编写的一个类,用于将 .NET 结构转换为字节数组,从而可以轻松地将其传递给 C/C++ 库:

    public static class BinaryStructConverter
    {
        public static T FromByteArray<T>(byte[] bytes) where T : struct
        {
            IntPtr ptr = IntPtr.Zero;
            try
            {
                int size = Marshal.SizeOf(typeof(T));
                ptr = Marshal.AllocHGlobal(size);
                Marshal.Copy(bytes, 0, ptr, size);
                object obj = Marshal.PtrToStructure(ptr, typeof(T));
                return (T)obj;
            }
            finally
            {
                if (ptr != IntPtr.Zero)
                    Marshal.FreeHGlobal(ptr);
            }
        }
    
        public static byte[] ToByteArray<T>(T obj) where T : struct
        {
            IntPtr ptr = IntPtr.Zero;
            try
            {
                int size = Marshal.SizeOf(typeof(T));
                ptr = Marshal.AllocHGlobal(size);
                Marshal.StructureToPtr(obj, ptr, true);
                byte[] bytes = new byte[size];
                Marshal.Copy(ptr, bytes, 0, size);
                return bytes;
            }
            finally
            {
                if (ptr != IntPtr.Zero)
                    Marshal.FreeHGlobal(ptr);
            }
        }
    }
    

    【讨论】:

    • 那里有一段不错的代码。我很想说不安全的等价物更快一些,但也更具可读性。 :-)
    • @Noldorin,你可能是对的,但我通常会避免使用不安全的代码,除非性能至关重要;)
    • 是的,我以前也听说过。你的理由是什么?就我而言,Marshal 并不是真正的“更安全”。也不是更糟/更糟!
    • @Noldorin,说实话我并没有真正考虑清楚......这可能只是对指针的非理性恐惧^^
    • 顺便说一句,我只是试图用不安全的代码来做,我意识到我不知道怎么做......我收到这个错误:无法获取地址,获取的大小,或声明指向托管类型 ('T') 的指针。有什么想法吗?
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      Boost 有 serialization libraries 允许 XML 、二进制和文本序列化。我想说这是一个非常简单的场景,您可以使用 Boost 在 C++ 中序列化为 XML,然后在 C# 中反序列化。

      如果您希望 2 个应用程序相互通信,我还建议您考虑联网。 C# 内置了套接字,C++ 有 Boost::Asio ,通过 127.0.0.1 进行通信非常容易:)

      希望有帮助

      【讨论】:

        猜你喜欢
        • 2017-07-05
        • 1970-01-01
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 2012-06-27
        • 1970-01-01
        • 2018-05-01
        • 2015-06-28
        相关资源
        最近更新 更多