我已经在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显然可以检查真实对象,因此我希望它可以工作。
谢谢
答案 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的特定限制。