我一直在读书,但我没有找到解决问题的方法
我目前正在处理一个包含所有数据的业务对象,我们需要将此对象转换为XML格式。
我的对象包含一系列动作(列表...),但有两种动作类型(目前为止)。 我必须操作类型SimpleAction和CompositeAction,它们都从IAction继承,允许它们都保存在Actions列表中。
现在您可能会看到问题,因为接口无法序列化,因为它们没有数据。
如果使用一些示例代码,我是如何编写获取该对象类型的Class或Serializer,然后使用正确的类型执行序列化对象?
一些代码:
[XmlArray("Actions")]
public List<IAction> Actions { get; set; }
public interface IAction
{
int ID { get; set; }
ParameterCollection Parameters { get; set; }
List<SectionEntity> Validation { get; set; }
TestResultEntity Result { get; set; }
string Exception { get; set; }
}
[XmlType("A")]
public class SimpleActionEntity : IAction
{
#region IAction Members
[XmlAttribute("ID")]
public int ID { get; set; }
[XmlIgnore]
public ParameterCollection Parameters { get; set; }
[XmlIgnore]
public List<SectionEntity> Validation { get; set; }
[XmlIgnore]
public TestResultEntity Result { get; set; }
[XmlElement("Exception")]
public string Exception { get; set; }
#endregion
}
非常感谢任何帮助。 :)
答案 0 :(得分:4)
你可以使用XmlArrayItemAttribute,正如我们所讨论的那样创建一个IAction列表没有用,所以最好创建基类
public interface IAction {}
public abstract class ActionBase : IAction {}
public class SimpleAction : ActionBase {}
public class ComplexAction : ActionBase {}
[XmlArray("Actions")]
[XmlArrayItem(typeof(SimpleAction)),XmlArrayItem(typeof(ComplexAction))]
public List<ActionBase> Actions { get; set; }
实际上你也可以像这样控制xml文件中的元素名称:
[XmlArray("Actions")]
[XmlArrayItem(typeof(SimpleAction),ElementName = "A")]
[XmlArrayItem(typeof(ComplexAction),ElementName = "B")]
public List<ActionBase> Actions { get; set; }
答案 1 :(得分:2)
好的,我已经创建了一个解决方案,我觉得我做得非常好。
我所做的不是举行
[XmlArray("Actions")]
public List<IAction> Actions { get; set; }
我决定创建一个处理List BUT的ActionCollection类,也允许我使用IXMLSerializable来覆盖ReadXml和WriteXML方法,这样我就可以处理列表序列化和反序列化的方式。
[XmlElement("Actions")]
public ActionCollection Actions { get; set; }
public class ActionCollection: CollectionBase, IXmlSerializable
{
#region IList Members
...
#endregion
#region ICollection Members
...
#endregion
#region IEnumerable Members
...
#endregion
#region IXmlSerializable Members
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
//TODO
}
public void WriteXml(System.Xml.XmlWriter writer)
{
foreach (IAction oAction in List)
{
XmlSerializer s = new XmlSerializer(oAction.GetType());
s.Serialize(writer, oAction);
}
}
#endregion
}
答案 2 :(得分:0)
也许你从一个实现接口的公共抽象基类派生你的两个动作类?
public interface IAction {}
public abstract class ActionBase : IAction {}
public class SimpleAction : ActionBase {}
public class ComplexAction : ActionBase {}
然后使用List<IAction>
。
List<ActionBase>