初始化可序列化对象[.NET]

时间:2015-10-21 23:10:46

标签: c# .net serialization

我正在尝试实现需要初始化的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没有。不确定为什么需要它。

1 个答案:

答案 0 :(得分:1)

不,XML序列化中没有提供任何工厂来创建对象而不是默认构造函数的机制。