如何在.Net中序列化COM对象?

时间:2009-07-06 06:06:41

标签: c# xml-serialization com-interop delphi.net

我需要使用.net或Delphi .Net使用.net序列化一个Com对象 这有可能吗?

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

您可以通过将COM对象包装在(可序列化的).NET类中,然后公开要序列化的字段来实现此目的。

答案 2 :(得分:1)

您可以获得托管ObjectGetObjectForIUnknown方法。然后,您可以序列化此托管对象。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我已经能够通过标准的运行时可调用包装COM互操作序列化导入C#的COM对象。

只要要序列化的对象使用由互操作生成的的类型-而不是接口,此方法就应该起作用。

说您要在原始/本机代码中序列化为SomeType的对象的类型。在Visual Studio对象浏览器中,您应该在互操作库中看到几个粗略的等效项:

  • 接口SomeType

  • 接口_SomeType

  • SomeTypeClass

这是最后一个必须用于序列化的

(至少这是基于VB6的类的显示方式)。

要使其正常工作,请在C#代码中设置对COM DLL的引用。 Visual Studio应该自动生成一个互操作DLL。 (生成互操作DLL的过程涉及检查COM DLL的typelib元数据,并使用它来生成托管类。因此,基于反射的序列化工作所需的所有信息都应该可用。)

然后,提供一些示例代码:

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

这应该将objectToSerialize的JSON序列化版本写到GZIP压缩文件中。


请注意-答案为based on info in another question

答案 5 :(得分:-2)

我不确定您在C ++,。Net或任何其他语言中序列化数据的方式会有所不同。 COM对象就像一个类,可以通过获取每个数据成员并将其序列化来序列化。我在C ++中确实喜欢这样。

我认为在.Net中应该是相同的,除非有特定的API来执行它。