【发布时间】:2015-10-21 23:10:46
【问题描述】:
我正在尝试实现一个需要初始化的IXmlSerializable 类,但由于序列化使用默认构造函数,因此无法进行初始化。任何提示如何完成?
这是一个示例类。它有一个数组,在反序列化时,它必须从 XML 文件中复制/解码 only 固定数量的字节。需要初始化来告诉它那个固定数字是什么。
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# 中不允许的模板来解决此问题。
要根据 cmets 的要求添加更多详细信息,我要做的是在另一个类中使用 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。在旁注中,我必须向ReadXml() 添加ReadEndElement() 调用才能正确读取,尽管MSDN example 没有它。不知道为什么需要它。
【问题讨论】:
-
反序列化器应该如何知道要读取多少字节?会不会和一开始序列化的字节数不一样?
-
@DStanley 如果 XML 序列化程序会调用某种工厂来创建对象,那么该工厂可以为类中的该参数提供一些值。
-
旁注:ubi,由于没有现有的方法可以通过您展示的方法来实现您想要的,您能否在帖子中添加信息为什么您尝试这样做那个(或者你的实际目标是什么)?
标签: c# .net serialization