Как сериализовать COM-объект в .Net?
-
23-08-2019 - |
Вопрос
Мне нужно сериализовать объект 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.