将COM对象序列化为JSON?

时间:2018-09-19 17:43:28

标签: c# json com-interop

我已经在C#代码中设置了对COM DLL(从VB6编译)的引用。

我正在尝试使用JSON.NET(NewtonSoft)从该DLL中的类型序列化COM对象。

到目前为止我尝试过的代码:

    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具有许多深达几层的对象属性。

是否可以通过某种方式使序列化程序正确使用这种类型的类?

注意:

  • 使用由Visual Studio 2015自动生成的标准RCW互操作DLL加载DLL

  • 与此类对象的典型用法一样,运行时属性检查器显示该对象属性的“本机视图”和“动态视图”。我怀疑对象的这种处理方式与JSON.NET相似,并且如果仅查看“本机”视图,则可能错过了所有真实属性。另一方面,VS2015显然可以检查真实对象,因此我希望它可以工作。

谢谢

1 个答案:

答案 0 :(得分:0)

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

以示例为例,问题是原始VB6代码中OpenCV(3.4.1) C:\Miniconda3\conda-bld\opencv-suite_1533128839831\work\modules\highgui\src\window.cpp:579: error: (-213) The library is compiled without QT support in function cv::createButton. 的类型为objectToSerialize。在Visual Studio对象浏览器中,您可以在互操作库中看到几个粗略的等效项:

  • 接口SomeType

  • 接口SomeType

  • _SomeType

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

现在,奇怪的是,即使SomeTypeClass是一个接口,您也可以创建一个SomeType并以一种看似正常的方式对生成的对象进行操作。但同样明显的是,该对象不允许JSON.net序列化使用的反射类型。

注意-ObjectDumper的行为应与这些类型相同。因此,这似乎并不是JSON.NET的特定限制。