我想序列化一个类作为属性。以下是用例:我需要将大量工程参数存储在xml配置文件中。涉及科学记数法,并且客户要求输入的值保持用户输入的确切形式。例如,如果有人输入“5.3e-1”,那么它必须保持那样,并且不能被转换成例如“0.53”。为此,我创建了一个Params类,用于存储输入的字符串和双精度值(实际存储双精度值仅用于稍后的处理效率)。现在有个窍门:我只想将字符串值序列化,并且我希望序列化为一个属性。如何将类序列化为属性?
例如,如果一个对象包含两个参数,A和B,其中该串的值是A.stringVal = “1.2e5” 和B.stringVal = “2.0”,那么我想:
public class MyObject
{
[XmlAttribute]
public MyParam A { get; set; }
[XmlAttribute]
public MyParam B { get; set; }
...more stuff...
}
连载到:
<myObject A="1.2e5" B="2.0">
more stuff...
</myObject>
我的问题是非常相似的一问here。与他不同,我很好地实现了IXmlSerializable(并且更喜欢),我只是无法使它工作。当我尝试序列化它时,我得到一个神秘的异常,说:“有错误反射类型。”我究竟做错了什么?
public class MyParam : IXmlSerializable
{
string name;
string stringVal;
double doubleVal;
public string Val
{
get
{
return stringVal;
}
set
{
stringVal = value;
doubleVal = double.Parse(value);
}
}
public double DoubleVal
{
get
{
return doubleVal;
}
set
{
doubleVal = value;
stringVal = value.ToString();
}
}
public MyParam(string name)
{
this.name = name;
this.stringVal = string.Empty;
this.doubleVal = double.NaN;
}
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
throw new NotImplementedException();
}
public void WriteXml(System.Xml.XmlWriter writer)
{
writer.WriteAttributeString(name, stringVal);
}
}
看看内部异常:““无法序列成员‘ConsoleApplication2.MyObject.A’类型‘ConsoleApplication2.MyParam’,请参阅内部异常的更多细节。”',然后去看看那个内部异常: '“ConsoleApplication2.MyParam不能被序列化,因为它没有无参数的构造函数。” – 2014-09-12 17:11:50