【问题标题】:How to serialize Pen in C#?如何在 C# 中序列化 Pen?
【发布时间】:2011-12-24 10:55:40
【问题描述】:

我有一个包含

的 Shape 类
public Pen outlinePen;  

我尝试做的是序列化形状列表,但我只有Type

“System.Drawing.Pen”在程序集“System.Drawing,版本=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 未标记为 可序列化。

如果我将此字段标记为[field: NonSerialized()],那么我将无法使用我加载的对象,因为outlinePen 为空。

还有其他方法可以序列化 System.Drawing.Pen 吗?

【问题讨论】:

  • 如果要序列化,为什么要标记为NonSerializable

标签: c# serialization system.drawing


【解决方案1】:

您应该只序列化您感兴趣的数据。 Pen 是一个图形对象,所以即使有可能,imo,存储它也不是一个好主意。

例如,在您的情况下,您可以像PenDataObject 一样存储PenColorPenWidthPenStyle,这是一种专门为存储Pen 数据而创建的Pen 轻量级对象。

希望这会有所帮助。

【讨论】:

  • 谢谢,我一直在想,但我尽量避免,因为我在课堂上用钢笔画的。现在我已经按照你写的做了。
【解决方案2】:

Pen 在内部被 .NET 标记为不可序列化,并且它是密封的,因此您也不能对其进行子类化和序列化。如果需要对图形进行序列化,可以查看Metafile class,专门用于存储图形和绘图对象。

【讨论】:

    【解决方案3】:

    我会推荐一种不同的方法,涉及在反序列化父对象时执行一些逻辑。

    [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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      相关资源
      最近更新 更多