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

C# 如何在.Net中序列化COM对象?,c#,xml-serialization,com-interop,delphi.net,C#,Xml Serialization,Com Interop,Delphi.net,我需要使用c#或Delphi.net使用.net序列化Com对象 这是可能的吗?您可以通过将COM对象包装在(可序列化的).NET类中,公开要序列化的字段来实现这一点。您可以通过将COM对象包装在(可序列化的).NET类中来实现,公开要序列化的字段。您可以通过方法获得托管的对象。然后,您可以序列化此托管对象。您可以通过方法获得托管对象。然后,您可以序列化此托管对象。检查您的COM对象是否实现,或任何其他变体--这将是您的最佳选择。检查您的COM对象是否实现,或者其他任何变体——这是你最好的选择。

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

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

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

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

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

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

检查您的COM对象是否实现,或者其他任何变体——这是你最好的选择。

< P>我不确定你在C++、.NET或任何其他语言中如何序列化你的数据会有不同。 COM对象就像一个类,可以通过获取每个数据成员并序列化它来序列化。C++中,我这样做。

我认为,除非有特定API,否则.NET中的情况应该是相同的。

< P>我不确定在C++、.NET或任何其他语言中如何序列化数据有什么不同。 COM对象就像一个类,可以通过获取每个数据成员并序列化它来序列化。C++中,我这样做。
我认为这在.Net中应该是相同的,除非有特定的API来完成它。

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

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

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

只要被序列化的对象使用的是interop生成的类的类型,而不是接口的类型,这就应该有效

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

  • 接口
    SomeType

  • 接口
    \u 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压缩文件



注意-这个答案是。

我已经能够通过标准的运行时可调用包装器COM interop将COM对象序列化到C中

只要被序列化的对象使用的是interop生成的类的类型,而不是接口的类型,这就应该有效

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

  • 接口
    SomeType

  • 接口
    \u 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压缩文件



注意-答案是。

肯定有人有代码样本吗?@Robert:为什么会有代码样本?总的来说,这个问题甚至没有任何意义。COM对象了解XML吗?它知道如何序列化自己吗?甚至可以使用默认参数创建对象的实例,然后设置所有属性(反序列化时必须这样做)?@johnsaunder有一些序列化程序,它们通过对象上的反射来工作;对象本身不必知道关于它的任何信息。我还认为COM对象必须有一个公共的无参数构造函数,所以它应该能够创建一个,然后设置它的值。@DaveInCaz:假设COM对象的所有重要位都可以通过反射(
IDispatch
)使用。一般来说,情况并非如此。肯定有人有代码样本吗?@Robert:为什么会有代码样本?总的来说,这个问题甚至没有任何意义。COM对象了解XML吗?它知道如何序列化自己吗?甚至可以使用默认参数创建对象的实例,然后设置所有属性(反序列化时必须这样做)?@johnsaunder有一些序列化程序,它们通过对象上的反射来工作;对象本身不必知道关于它的任何信息。而且我还认为COM对象必须有一个公共的无参数构造函数,所以它应该能够创建一个,然后设置它的值。@DaveInCaz:这假设所有