数据库形状列表

时间:2009-10-23 15:05:15

标签: c# wpf wcf serialization

我有一个通用的形状集合,我需要通过WCF存储到数据库中以供将来/共享使用。不幸的是,System.Windows.Shapes都是密封的,所以我不能继承它们并制作它们的可序列化副本。我“可以”编写我自己的自定义可串行形状集,因为我已经为我的应用程序编写了3个自定义形状,但是如果可能的话我不想这样做。

我完全清楚我可以使用XAMLReader和XAMLWriter将它们从屏幕上移开并放回去,但这还不够好,因为包含形状的Grid的大小并不总是同样,我需要相应地重新定位形状。这些形状被用作另一幅图像的叠加层,形状与背景图像保持在同一位置非常重要。

任何想法或帮助都将不胜感激。

〜的md5sum〜

2 个答案:

答案 0 :(得分:3)

另一个解决方案是创建序列化方法,该方法作为参数形成,并将属性序列化为xml或任何你想要的。一个例子就是:

/// <summary>use reflection to serialize all properties and type into an xml string</summary>
/// <param name="s">shape object to be serialized</param>
/// <return>the serialized xml string</return>
public static string SerializeShape(Shape s);

/// <summary>create a new Shape object with given xml data</summary>
/// <param name="s">xml serialization generated by SerializeShape(Shape s)</param>
/// <return>the constructed shape</return>
public static Shape DeserializeShape(string s);

您可能需要稍微更改方法以更好地适应您的对象。最糟糕的情况是,您必须为不同的形状创建几对序列化/反序列化方法。

答案 1 :(得分:0)

你是对的。如果它们被密封,它们就不能被继承,因此不能被序列化。您将不得不创建自己的自定义形状类。我假设您的问题是您不想重新创建所有方法和属性。

我建议你创建“精简”形状(就像今日美国是“精简”新闻)。只需输入完全定义每个形状所需的最小属性:

  • 方形:宽度(双倍),旋转 角度(双)和中心(点)。
  • 矩形:宽度,高度,中心和旋转角度。
  • Circle:Radius(double),Center
  • 椭圆:宽度,高度,中心,旋转 ......等等。

当你反序列化它们时,你将实例化实际的System.Windows.Shapes,但你不必重新创建整个事物。