1

我需要使用 .net 使用 c# 或 Delphi .Net 序列化 Com 对象,这可能吗?

4

6 回答 6

5

检查您的 COM 对象是否实现了IPersistStreamIPersistMemory或任何其他IPersist变体——这将是您最好的选择。

于 2009-07-06T06:21:29.970 回答
1

您可以通过将 COM 对象包装在(可序列化的).NET 类中来实现这一点,从而公开您想要序列化的字段。

于 2009-07-06T06:09:34.940 回答
1

Object您可以通过GetObjectForIUnknown方法获取 Managed 。然后,您可以序列化这个托管对象。

于 2009-07-06T06:14:45.850 回答
0

不仅仅是通过将对象传递给序列化器 - 在 COM 对象包装器上实现 ISerializable 接口(主互操作程序集也是一个包装器)并定义您自己的序列化。

于 2009-07-06T06:24:20.323 回答
0

我已经能够序列化通过标准运行时可调用包装 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 序列化版本写入objectToSerializeGZIP 压缩文件。


注意 - 此答案基于另一个问题中的信息

于 2018-09-19T18:33:06.423 回答
-2

我不确定在 C++、.Net 或任何其他语言中序列化数据的方式会有什么不同。COM 对象就像一个类,可以通过获取每个数据成员并对其进行序列化来进行序列化。我在 C++ 中就是这样做的。

我认为这在 .Net 中应该是相同的,除非有特定的 API 可以做到这一点。

于 2009-07-06T06:24:04.987 回答