在接口或类似

时间:2009-08-13 14:49:53

标签: c# interface serialization

我有一个接口作为合同。现在我想定义所有实现接口为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?

3 个答案:

答案 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]属性执行此操作。

相关问题