【发布时间】:2014-05-12 05:16:03
【问题描述】:
假设我有一个简单的类
public class Document
{
public int Version { get; set; }
public string Name { get; set; }
public string Image { get; set; } // Base64 coded Bitmap object
}
现实世界的对象要复杂得多。我使用XmlSerializer.Serialize 将实例保存到文件中。
图像的内容是这样生成的:
byte[] result = null;
using (var image = Bitmap.FromFile(@"filename"))
using (var stream = new MemoryStream())
{
image.Save(stream, ImageFormat.Jpeg);
result = stream.ToArray();
}
var content = Convert.ToBase64String(result);
现在我有一个重大变化。 将来我想保存原始图像数据(也为base64)而不将其转换为jpg。
所以我的新对象将如下所示:
public class Document
{
public int Version { get; set; }
public string Name { get; set; }
public string RawImageString { get; set; }
}
幸运的是,我已经存储了一个版本属性(当前为每个 xml 文件的1)。对于新项目,我可以
现在我想知道是否有任何best practices 关于如何处理模型更改。
我正在考虑这种方法:
- 仍然在我的类中定义一个属性
ImageString,标记为已过时。 - 该属性将只有一个 setter 而没有 getter
-
如果设置了
ImageString,我只需更新RawImageStringpublic class Document { public int Version { get; set; } public string Name { get; set; } public string RawImageString { get; set; } [Obsolete("Use RawImageString instead")] public string ImageString { set { this.RawImageString = value; this.Version = 2; } } }
这应该可以很好地工作,但它需要我将旧资产维护到永远。我更喜欢
// depending on the version property XmlSerializer should return a
// different Document implementation
var serializer = new XmlSerializer(typeof(IDocument));
var document = (IDocument)serializer.Deserialize(reader);
当然,我可以使用工厂方法来实现这一点,但这需要两次读取。一个用于版本,第二个用于具体结果。
【问题讨论】:
-
最佳实践是逐步进行,而不是在整个代码中强制进行大量级联重构。看起来你已经正确地做到了。
-
您不将其设为位图对象的字节数组的任何特殊原因。 [XmlElementAttribute("RawImage", DataType = "base64Binary")] public byte[] RawImage { get;放; }
-
@linodh - 好建议,一开始没有考虑到这一点。事不宜迟,以后可能有用。谢谢。
标签: c# .net xml serialization xmlserializer