代码之家  ›  专栏  ›  技术社区  ›  StampedeXV

接口上或类似

  •  1
  • StampedeXV  · 技术社区  · 15 年前

    我有一个接口作为合同。现在,我想将实现接口的所有类定义为可序列化(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 回复  |  直到 15 年前
        1
  •  1
  •   STW    15 年前

    具有[serializable]属性的抽象基类是一个很好的选择,只要它适合您的需要。从基类继承的所有类也将标记为可序列化。

    请记住,serializable属性只是说“这个类可以序列化”,而实现ISerializable(或IXMLSerizable)意味着“这个类需要对其序列化进行手动控制”。简单序列化不需要ISerializable。

    更新: 如果类实现了接口而没有标记为可序列化,则还可以考虑编写自定义FxCop规则来生成警告。

    如果你的抽象类 替换 接口将覆盖所有的基础,但是如果保持接口分离,那么类仍有可能实现接口,而不是从基类继承接口——因此,有一种检测这些类的方法仍然很好。

        2
  •  0
  •   John Saunders    15 年前

    首先,您需要决定是使用XML序列化还是运行时序列化。XML序列化不使用 [Serializable] ISerializable .

    XML序列化需要知道您将要实现的所有类的具体类型。 IElement . 你这样做是为了 [XmlInclude] 属性。

        3
  •  0
  •   Dinah SLaks    14 年前

    因为接口支持继承,所以您应该能够说:

    interface IElement : ISerializable 
    {
      // IElement specific items
    }
    

    这将确保实现 IElement 也实现 ISerializable .