【发布时间】:2010-11-16 19:33:41
【问题描述】:
有没有一种简单的方法来序列化 C# 结构,然后从 c++ 反序列化它。 我知道我们可以将 csharp 结构序列化为 xml 数据,但我必须在 c++ 中实现 xml 反序列化器。
C# 中的哪种序列化程序最容易从 C++ 反序列化? 我希望两个应用程序(一个 C++ 和另一个 csharp )能够使用数据结构进行通信
【问题讨论】:
标签: c# c++ serialization
有没有一种简单的方法来序列化 C# 结构,然后从 c++ 反序列化它。 我知道我们可以将 csharp 结构序列化为 xml 数据,但我必须在 c++ 中实现 xml 反序列化器。
C# 中的哪种序列化程序最容易从 C++ 反序列化? 我希望两个应用程序(一个 C++ 和另一个 csharp )能够使用数据结构进行通信
【问题讨论】:
标签: c# c++ serialization
这是我编写的一个类,用于将 .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);
}
}
}
【讨论】:
Marshal 并不是真正的“更安全”。也不是更糟/更糟!
【讨论】:
Boost 有 serialization libraries 允许 XML 、二进制和文本序列化。我想说这是一个非常简单的场景,您可以使用 Boost 在 C++ 中序列化为 XML,然后在 C# 中反序列化。
如果您希望 2 个应用程序相互通信,我还建议您考虑联网。 C# 内置了套接字,C++ 有 Boost::Asio ,通过 127.0.0.1 进行通信非常容易:)
希望有帮助
【讨论】: