【发布时间】:2018-01-09 06:15:07
【问题描述】:
我在序列化/反序列化特定对象数组时遇到问题。
[System.SerializableAttribute()]
public class ctyp_HT
{
private Operationalmessage[] opm;
[System.Xml.Serialization.XmlElementAttribute("OpMessages", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public Operationalmessage[] P_OpMessages{
get {
return this.opm;
}
set {
this.opm= value;
}
}
}
使用此属性中的 set{},序列化进程会在运行时崩溃。没有 set{} 它会工作,但为什么。该类被标记为 [System.SerializableAttribute()]。 这是我与通用函数结合使用的函数调用:
SerializeObject<ctyp_HT>(objInstance);
public static string SerializeObject<T>(T serializableObject)
{
if (serializableObject == null) { return string.Empty; }
try
{
XmlDocument xmlDocument = new XmlDocument();
XmlSerializer serializer = new XmlSerializer(serializableObject.GetType());
using (MemoryStream stream = new MemoryStream())
{
serializer.Serialize(stream, serializableObject);
stream.Position = 0;
xmlDocument.Load(stream);
stream.Close();
}
return xmlDocument.InnerXml;
}
catch (Exception ex)
{
return (ex.Message + "\n" + ex.InnerException.Message + "\n" + ex.StackTrace + "\n\n\n" + ex.InnerException.StackTrace);
}
}
我做错了什么?谢谢帮忙。
在第一条评论后编辑:
[System.SerializableAttribute()]
public class Operationalmessage : I_Information
{
private object objGen;
[System.Xml.Serialization.XmlElementAttribute("OPEN", typeof(ctyp_intEndlage_AUF), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlElementAttribute("CLOSE", typeof(ctyp_intEndlage_ZU), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlElementAttribute("BETWEEN", typeof(ctyp_intEndlage_ZWISCHEN), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlChoiceIdentifierAttribute("objIdentifier")]
public object P_objGen
{
get { return objGen; }
set { objGen = value; }
}
private UnnamedChoice0 objIdentifier;
[System.Xml.Serialization.XmlIgnoreAttribute()]
public UnnamedChoice0 P_objIdentifier
{
get { return objIdentifier; }
set { objIdentifier = value; }
}
[System.Xml.Serialization.XmlIgnoreAttribute()]
public string P_Info
{
get
{
if(objGen is I_Information) return objIdentifier + "(" + ((I_Information)objGen).P_Info + ")";
else return objIdentifier + "(" + objGen + ")";
}
}
}
未命名的选择是一个公共枚举。由于我的生成器,类 ctyp_intEndlage_Auf/ZU/Zwischen 都相同但名称不同。
[System.SerializableAttribute()]
public class ctyp_intEndlage_AUF : I_Information
{
private ctyp_Infoquelle_BOOL1_In Informationsquelle = null;
[System.Xml.Serialization.XmlElementAttribute("Informationsquelle", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public ctyp_Infoquelle_BOOL1_In P_Informationsquelle
{
get { return Informationsquelle; }
set { Informationsquelle = value; }
}
private string Extension = "036";
[System.Xml.Serialization.XmlElementAttribute("Extension", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string P_Extension
{
get { return Extension; }
set { Extension = value; }
}
public string P_Info
{
get
{
string result = ""; return "( " + Informationsquelle.P_Info + " " + Extension + " " + result + ")";
}
}
public ctyp_intEndlage_AUF()
{
Informationsquelle = new ctyp_Infoquelle_BOOL1_In();
}
}
和最后一个类 bool1
[System.SerializableAttribute()]
public class ctyp_Infoquelle_BOOL1_In : I_Information
{
private object objGen;
[System.Xml.Serialization.XmlElementAttribute("HardwareEingang", typeof(string), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlElementAttribute("KoppelEingang", typeof(string), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlChoiceIdentifierAttribute("objIdentifier")]
public object P_objGen
{
get { return objGen; }
set { objGen = value; }
}
private UnnamedChoice1 objIdentifier;
[System.Xml.Serialization.XmlIgnoreAttribute()]
public UnnamedChoice1 P_objIdentifier
{
get { return objIdentifier; }
set { objIdentifier = value; }
}
public string P_Info
{
get
{
if(objGen is I_Information) return objIdentifier + "(" + ((I_Information)objGen).P_Info + ")";
else return objIdentifier + "(" + objGen + ")";
}
}
public ctyp_Infoquelle_BOOL1_In()
{
}
}
属性 P_Info 在 I_Information 接口中声明。 对不起所有的德国名字=)。
【问题讨论】:
-
你能加入
Operationalmessage吗?没有代码很难判断出什么问题。顺便说一句:对于数组,您希望使用XmlArray和XmlArrayItem属性而不是XmlElement(除非您不希望使用元素包装集合)。 -
当你序列化的时候属性必须是公开的而不是私有的
标签: c# xml wpf serialization exception-handling