我需要使用 .net 使用 c# 或 Delphi .Net 序列化 Com 对象,这可能吗?
6 回答
检查您的 COM 对象是否实现了IPersistStream、IPersistMemory或任何其他IPersist变体——这将是您最好的选择。
您可以通过将 COM 对象包装在(可序列化的).NET 类中来实现这一点,从而公开您想要序列化的字段。
Object
您可以通过GetObjectForIUnknown方法获取 Managed 。然后,您可以序列化这个托管对象。
不仅仅是通过将对象传递给序列化器 - 在 COM 对象包装器上实现 ISerializable 接口(主互操作程序集也是一个包装器)并定义您自己的序列化。
我已经能够序列化通过标准运行时可调用包装 COM 互操作引入 C# 的 COM 对象。
只要被序列化的对象使用互操作生成的类的类型- 而不是interface ,这应该可以工作。
说要序列化的对象的类型,如SomeType
原始/本机代码。在 Visual Studio 对象浏览器中,您应该会在互操作库中看到几个粗略的等效项:
界面
SomeType
界面
_SomeType
班级
SomeTypeClass
显然,它是最后一个必须用于序列化的。
(至少这是基于 VB6 的类的显示方式)。
要使其正常工作,请在 C# 代码中设置对 COM DLL 的引用。Visual Studio 应自动生成互操作 DLL。(生成互操作 DLL 的过程涉及检查 COM DLL 的类型库元数据并使用它来生成托管类。因此,基于反射的序列化工作所需的所有信息都应该可用。)
然后,一些示例代码:
var settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
};
var serializer = JsonSerializer.Create(settings);
using (var gz = new GZipStream(File.OpenWrite(filespec), CompressionMode.Compress))
using (var sw = new StreamWriter(gz))
using (var writer = new JsonTextWriter(sw))
{
serializer.Serialize(writer, objectToSerialize);
}
这应该将 JSON 序列化版本写入objectToSerialize
GZIP 压缩文件。
注意 - 此答案基于另一个问题中的信息。
我不确定在 C++、.Net 或任何其他语言中序列化数据的方式会有什么不同。COM 对象就像一个类,可以通过获取每个数据成员并对其进行序列化来进行序列化。我在 C++ 中就是这样做的。
我认为这在 .Net 中应该是相同的,除非有特定的 API 可以做到这一点。