Вопрос

Мне нужно сериализовать объект com с использованием .net с использованием c# или delphi .net это возможно?

Это было полезно?

Решение

Вероятно, вы могли бы сделать это, обернув COM-объект в (сериализуемый) класс .NET, открыв поля, которые вы хотите сериализовать.

Другие советы

Проверьте, реализует ли ваш COM-объект IPersistStream, IPersistMemory или любой другой из IPersist варианты - это будет ваш лучший выбор.

Вы можете получить управляемый Object через GetObjectForIUnknown Метод.Затем вы можете сериализовать этот управляемый объект.

Не просто передавая объект сериализатору — реализуйте интерфейс ISerializable в оболочке COM-объекта (первичная сборка взаимодействия также является оболочкой) и определите свою собственную сериализацию.

Мне удалось сериализовать COM-объекты, перенесенные в C#, с помощью стандартного COM-взаимодействия с вызываемой оболочкой во время выполнения.

Это должно работать до тех пор, пока сериализуемый объект использует тип сгенерированного взаимодействием. сорт - не интерфейс.

Скажем, тип объекта, который вы хотите сериализовать, как SomeType в исходном/родном коде.В браузере объектов Visual Studio вы должны увидеть несколько приблизительных эквивалентов в библиотеке взаимодействия:

  • Интерфейс SomeType

  • Интерфейс _SomeType

  • Сорт SomeTypeClass

Это последний который, по-видимому, должен использоваться для сериализации.

(По крайней мере, так выглядят классы на основе VB6).

Чтобы это заработало, установите ссылку в коде C# на COM DLL.Visual Studio должна автоматически создать библиотеку взаимодействия DLL.(Процесс создания библиотеки взаимодействия DLL включает проверку метаданных библиотеки типов COM DLL и их использование для создания управляемых классов.Таким образом, вся информация, необходимая для работы сериализации на основе отражения, должна быть доступна.)

Затем пример кода:

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

Это должно записать сериализованную версию JSON objectToSerialize в файл, сжатый GZIP.


Обратите внимание: этот ответ был на основе информации в другом вопросе.

Я не уверен, что будет разница в том, как вы сериализуете свои данные на C++, .Net или на любом другом языке.COM-объект подобен классу и может быть сериализован путем получения каждого элемента данных и его сериализации. Мне это удалось в C++.

Я думаю, что в .Net должно быть то же самое, если для этого нет специальных API.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top