2010-03-29 43 views
0

目前,我有一些接口(剥离下来这里):如何通过接口强制执行xml序列化?

public interface IJobGroup 
{ 
    string Name { get; } 
    IEnumerable<IJobItem> Jobs { get; } 
} 

public interface IJobItem 
{ 
    string Name { get; } 
    void Start(); 
    event EventHandler Finished; 
} 

而且我做了这些接口的一些实现。但现在我想序列化我的JobGroup。到目前为止,我已经对DataContractSerializer和XMLSerializer进行了一些尝试,并将所有必需的属性添加到了上述接口的实现中。

到目前为止,这么好。但我想用我所需的解决方案解决两件事:

  1. 强制每个实现我的接口的人使他的类可序列化为xml。
  2. 如果我序列化一个IJobGroup,我想在明文中看到生成的xml文件中的所有内容,而不是Base64编码数据。 在这种情况下,有人可以手动更改xml文件(如果他知道他在做什么)。

一些想法,这并不能很好地工作:

  • ISerializable

    这并没有真正执行序列化对象。它相当习惯于实现自定义序列化器,而不是使用属性的默认用法。该包封的序列化(例如byte[] State

    我可以添加另一个字节数组属性国家到接口,这将在获取和设置串行数据接口内

  • 属性。也许这会有好处,每个项目都可以实现它自己的序列化过程。但缺点是大的xml文件包含byte []作为Base64编码的数据块,不能被人轻松读取。

所以,也许有人有一个想法或可能指向我的正确方向。

回答

1

如何使用抽象类?我不认为你可以强制接口的行为...接口比其他任何东西更契合...

+0

这将是一种可能的方式。但我(和我的同事)喜欢面向契约的接口方式。那么,为什么没有一个好的方法来说明“让我的序列化”这个合约? – Oliver 2010-03-31 06:23:44

+0

这是一个很好的问题。但是我认为你已经到了问题的地步,你必须决定构建自己的ISerializable实现,自定义序列化程序还是抽象类。不漂亮的选择,这是肯定的...! – code4life 2010-03-31 14:33:58

+0

即使我不喜欢答案,这是我必须接受的。 ;-) – Oliver 2010-04-09 11:28:08

0

默认的XML序列化默认情况下不支持接口,但是您可能能够从XmlSerializer派生并使用该框架构建某些内容?

+0

而不是建立自己的我希望已经存在的东西。 – Oliver 2010-03-31 06:21:58