C#反序列化是否通过自定义代码自动将字符串反序列化为要属性的字节数组



我有一个以字节数组作为属性的类,作为二进制

[System.Xml.Serialization.XmlAttributeAttribute(DataType="hexBinary")]
public byte[] aValue {
get {
return this.aValueField;
}
set {
this.aValueField= value;
}
}

数据本身。。。对于aValue。。。在我试图在某些文件中反序列化的XML文件中有一个String.

为了反序列化,我这样做:

XmlSerializer xml = new XmlSerializer(typeof(Data));
using (Stream reader = new FileStream(file, FileMode.Open))
{
config = (Data)xml.Deserialize(reader);
}

问题是,XML文件中的数据有一个字符串,没有字节[](但其他文件也有有效的字节[](。我不能更改输入文件数据,也不能将属性更改为String,对于处理的其他文件,它必须是byte[]。如果输入是String,那么在反序列化过程中,是否有一种方法可以通过仅此字段的代码进行自定义转换,从而使用逻辑进行到byte[]的自定义转换?这样它就不会例外,也不会得到类。

如果您可以区分代码中的字符串和byte[],您可以添加另一个属性来处理序列化,并使aValue XmlIgnore,这样它就不会被反序列化,但它仍然会在bValue集中设置。

private string bValueField;
[System.Xml.Serialization.XmlIgnore]
public byte[] aValue { get; set; }
[System.Xml.Serialization.XmlAttribute("aValue")]
public string bValue
{
get
{
return bValueField;
}
set
{
if (value.Contains("string identifier here")) // i.e. it's not a byte[]
{
aValue = new byte[] { };
bValueField = value;
}
else // it's a byte[]
{
var formatter = new BinaryFormatter();
using (var stream = new MemoryStream(Encoding.Unicode.GetBytes(value ?? "")))
{
aValue = (byte[])formatter.Deserialize(stream);
bValueField = "not a string";
}
} 
}
}

最新更新