public interface IXmlSerialize<T>
{
T FromXElement(XElement xelement);
XElement ToXElement(T obj);
}
有一个接口集成了这个接口
public interface IA : IXmlSerialize<IA>
{}
接下来一个类实现他们
public class A : IA
{
Public XElement ToXElement(IA a)
{}
Public IA FromXElement(XElement xelement)
{}
}
这样在调用的使用就会变成
IA a = new A();
XElement element = a.ToXElement(a);
总觉得这里不合适,大家给个建议吧
应该是这样的
public interface IXmlSerialize
{
object FromXElement(XElement element);
XElement ToXElement(object o);
}
不需要为每个类型实现一个序列化操作。
也就是,不应该每增加一个类ClassA,就需要加一个XmlSerialzer<ClassA>的实现——这样的设计,不是单一变动的。
如果是每个类需要实现一个序列化和反序列化操作的话,应该这样设计。
public interface IXmlSerialiable
{
void FromXElement(XElement element);
XElement ToXElement();
}
让需要序列化的类继承这个接口。
在FromXElement中,对自身的属性进行赋值;在ToXElement中,生成一个XElement对象,取值来自于自身对象的属性值。
a.ToXmlElement(a);
为什么a自己的方法要把自己传进去?这里肯定不合理的。我看你提供的代码,大体上感觉你是把“被序列化的对象”和“序列化器”写在同一个类A里了。导致a的方法要把自己给传进去,因为a即是serializer,又是需要被序列化的instance。还是将两者分开比较好,否则会有这样的代码:
A a = new A(); //一个空的a,没什么用,只是为了调FromElement方法
a = a.FromElement(element); //我已经有a了,又重新赋值了一遍
应该有一个类大概叫 XxxSerializer,序列化的逻辑都在这里面,然后被序列化的对象(比如User, Order等)都跟序列化没有关系,他们压根就不知道什么是序列化。
非常感谢!
其实可能我名字叫的不太好,IXmlSerialize的操作是和A,或者其他从IA继承的类(假如是B)有关系的
大概就是把A,B类中的属性或其他按照某种规则生成XML.或从XML中读取,给这些类的一些属性赋值。而且涉及到好多类都需要这种操作,这些处理又觉得一定要做,可能就给设计了这么个接口。
我在往下做的时候觉得有些不合适,求指点。。。。。。。
@leon_ALiang: 也就是“A和其他从IA继承的类(如B)”这些是你要序列化的对象(业务模型对象)。它们不应该包含任何序列化相关的东西。你的序列化逻辑应该都在一个serializer类里,大概是这样:
class MySerializer<T> where T : IA //只能处理某些特定的业务模型
{
public T FromXElement(XElement element) { ... }
public XElement ToXElement(T obj) { ... }
}
@水牛刀刀:
可是如果
public interface IB : IXmlSerialize<IA>
{}
public class B:IB
{}
这样还得在来一个类,主要是IA,IB的处理不同,没办法用一个T才做序列化和发序列化的所有操作
class MySerializer<T> where T : IB //只能处理某些特定的业务模型
{
public T FromXElement(XElement element) { ... }
public XElement ToXElement(T obj) { ... }
}
@leon_ALiang: 你别用IA IB了,你把实际上的类名说一下吧,不清楚要什么。
@水牛刀刀:
好的。
这是一组:
public interface IPrompt: IXmlSerialize<IPrompt>
{
}
public class Prompt : IPrompt
{
public XElement ToXElement(IPrompt prompt){...}
public IPrompt FromXElement(XElement xelement){...}
}
下面一组:
public interface IPromptGroup : IXmlSerialize<IPromptGroup>
{
}
public class PromptGroup : IPromptGroup
{
public XElement ToXElement(IPromptGroup promptGroup){...}
public IPromptGroup FromXElement(XElement xelement){...}
}
两个类中实现的两个方法是不一样的,都和具体的类有关。
他们按照各自的规则生成XElement.
@leon_ALiang: 既然你自己都说了没什么共同的,跟具体类有关,那有什么好抽象出来的呢?
@水牛刀刀:
共同点就是都需要实现IXmlSerialize接口的两个方法啊
你不需要一个泛型类吧,改成两个泛型方法就好了。如前面几位所说把你的序列化操作和数据对象分离。
其实样的设计,我个人建议先在.net framework里找找类似的设计,会给你很多启发的