我正在尝试实现需要初始化的IXmlSerializable
类,但由于序列化使用默认构造函数,因此无法进行初始化。有什么提示可以做到吗?
这是一个示例类。它有一个数组,当反序列化时,它必须从XML文件中复制/解码仅固定数量的字节。需要初始化来告诉它固定的数字是什么。
public class XmlByteArray : IXmlSerializable
{
public Byte[] Values;
// serialization will use this constructor so Values won't be instantiated
public XmlByteArray()
{
}
// Values array needs to be instantiated
public XmlByteArray(int size)
{
Values = new Byte[size];
}
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
var str = reader.ReadString();
reader.ReadEndElement();
// decode str into a Byte array
Byte[] v = Enumerable.Range(0, str.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(str.Substring(x, 2), 16))
.ToArray();
Array.Copy(v, Values, Values.Length);
}
public void WriteXml(XmlWriter writer)
{
var str = BitConverter.ToString(Values).Replace("-", "");
writer.WriteString(str);
}
}
如果这是c ++,我想通过使XmlByteArray
模板采用int
类型来解决此问题,但c#中不允许这样做。
要在评论中添加更多详细信息,我要做的是在另一个类中使用XmlByteArray
的对象并读取这样的文件
<SomeClass>
<memberA>blah blah</memberA>
<memberB>0A0B0C0D</memberB>
<memberC>0A0B0D</memberC>
</SomeClass>
序列化的类将是
public class SomeClass
{
public SomeClass()
{ }
public string memberA = "";
public XmlByteArray memberB = new XmlByteArray(2);
public XmlByteArray memberC = new XmlByteArray(3);
}
反序列化memberB.Values
应该{0x0A, 0x0B}
而不是{0x0A, 0x0B, 0x0C, 0x0D}
。序列化文件是手动编辑的,因此反序列化的数据可能与程序序列化的方式不一致。
PS。在旁注中,我必须向ReadEndElement()
添加ReadXml()
来调用以获得正确的读数,尽管此MSDN example没有。不确定为什么需要它。
答案 0 :(得分:1)
不,XML序列化中没有提供任何工厂来创建对象而不是默认构造函数的机制。