繁体   English   中英

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

[英]How Do I serialize a COM object in .Net?

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

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

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

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

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

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

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

假设您要在原始/本机代码中序列化为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压缩文件中。


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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM