我有一个接口作为合同。现在我想定义所有实现接口为Serializable(XML)的类。
我想做的事情如下:
public void DoSomethingWithElement( string element )
{
IElement e = DeserializeElement(element);
}
void SerializeElement(IElement e)
{
XmlSerializer xmlFormat = new XmlSerializer(typeof(IElement));
Stream fStream = new MemoryStream();
xmlFormat.Serialize(fStream, e);
string element = ASCIIEncoding.Default.GetString(fStream.GetBuffer());
DoSomethingWithElement(element);
}
有一个简单的方法吗?也许使用属性? 如果没有,你有什么建议: 不使用接口但可能是抽象类? 实现ISerializable?
答案 0 :(得分:1)
具有[Serializable]属性的抽象基类是一个非常好的选择,只要它适合您的需要。从基类继承的所有类也将标记为可序列化。
请记住,Serializable属性只是说“此类可以序列化”,而实现ISerializable(或IXmlSerializable)意味着“此类需要手动控制其序列化”。简单序列化不需要ISerializable。
更新:如果某个类实现了您的界面而没有标记为可序列化,您还可以考虑编写自定义FxCop规则来生成警告。
如果您的抽象类替换了接口,那么它将涵盖所有理由,但是如果您保持接口分离,那么类仍然有可能实现接口而不是从基础继承-class - 所以有办法检测这些类仍然很好。
答案 1 :(得分:0)
因为接口支持继承,所以你应该只能说:
interface IElement : ISerializable
{
// IElement specific items
}
这将确保任何实现IElement
的类也实现ISerializable
。
答案 2 :(得分:0)
首先,您需要确定是使用XML序列化还是运行时序列化。 XML序列化不使用[Serializable]
或ISerializable
。
XML序列化需要知道您将实现的所有类的具体类型IElement
。您可以使用[XmlInclude]
属性执行此操作。