Как сериализовать Pen в C #? - PullRequest
3 голосов
/ 24 декабря 2011

У меня есть класс Shape, который содержит

public Pen outlinePen;  

Я пытаюсь сериализовать List of Shape, но все, что у меня есть, это Type

'System.Drawing.Pen' в сборке 'System.Drawing, версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a 'не помечена как сериализации.

Если я отмечу это поле как [field: NonSerialized()], тогда я не смогу использовать свои загруженные объекты, потому что outlinePen имеет значение null.

Есть ли другие способы сериализации System.Drawing.Pen?

Ответы [ 3 ]

3 голосов
/ 24 декабря 2011

Вы должны сериализовать только те данные, которые вас интересуют. Pen - это графический объект, поэтому, даже если бы это было возможно, имхо, не очень хорошая идея хранить его.

Например, в вашем случае вы можете хранить PenColor, PenWidth и PenStyle как PenDataObject, который является своего рода Pen облегченным объектом, специально созданным для хранения Pen данных.

Надеюсь, это поможет.

1 голос
/ 24 декабря 2011

Pen внутренне помечен как не сериализуемый в .NET, и он запечатан, так что вы также не можете создать подкласс и сериализовать его. Если вам нужно сериализовать графику, вы можете обратиться к классу Metafile , который специально предназначен для хранения графики и графических объектов.

0 голосов
/ 04 мая 2012

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

[NonSerialized]
private Pen _penToUse;

[OnDeserialized()]
internal void Reinitialize(StreamingContext context)
{
    SwitchPen(); //now we can restore the Pen, the easy way would be 
                 //to store it in a static class in the domain
}
...