Как сериализовать экземпляр класса CustomLineCap - PullRequest
3 голосов
/ 07 февраля 2012

CustomLineCap не имеет примененного к нему SerializableAttribute.

Я хочу добавить свойство этого типа в граф объектов, который в настоящее время сериализуется / десериализуется с помощью BinaryFormatter.

Я попытался перейти на сериализацию XML, но у нее есть куча дополнительных требований, и я не хочу дурачиться с этим ESP. так как это не мой код; это какой-то открытый исходный код, который я скачал.

Если есть способ заставить BinaryFormatter игнорировать свойство, это может сработать.

Я бы предпочел подкласс этого; Я просто не знаю, сработает ли это тоже.

1 Ответ

1 голос
/ 08 февраля 2012

Вы не сможете напрямую сериализовать экземпляр класса CustomLineCap . Он происходит от MarshalByRefObject класса , и хотя это не показатель того, что не может быть сериализованным, это почти всегда регистр.

Причина в том, что класс MarshalByRefObject обычно является индикатором того, что производный от него объект имеет контекст только в той области приложения, в которой находится экземпляр. В этом случае вы CustomLineCap экземпляр - это объект GDI , который имеет какое-либо значение только в том процессе, в котором он живет (он явно привязан к дескриптору).

Тем не менее, я бы порекомендовал использовать шаблон адаптера для создания оболочки, которая захватывает свойства экземпляра CustomLineCap, который вы хотите сериализовать, а затем выставлять и сериализовать , .

Обычно это тот подход, который вы хотели бы использовать с любым классом, который имеет контекст, связанный с конкретным доменом, который при сериализации сохраняется за пределами этого домена, не имеет смысла больше.

Обратите внимание, что подклассы не будут работать и в этом сценарии, поскольку применение SerializableAttribute к вашему подклассу означает, что все поля (даже частные, к которым у вас нет доступа) ) будет сериализован, включая любые дескрипторы, которые имеют контекст только в той области приложения, в которой они созданы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...