【问题标题】:C# Deserialization automatically deserialize a String as a byte array to attribute via custom code?C#反序列化自动将字符串反序列化为字节数组以通过自定义代码进行属性?
【发布时间】:2019-10-28 20:06:03
【问题描述】:

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

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

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

为了反序列化我这样做:

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

问题是,XML 文件中的数据有一个字符串,没有一个字节[](但其他文件也有一个有效的字节[])。我不能更改输入文件数据,也不能将属性更改为字符串,对于处理的其他文件,它必须是字节 []。有没有办法在这个反序列化过程中以某种方式在通过代码期间进行自定义转换,如果输入是字符串,使用逻辑对字节 [] 进行自定义转换?这样它就不会异常,也不会得到类。

【问题讨论】:

  • 所以有时是二进制,有时是字符串?你能在编辑中展示两者的例子吗?
  • 它会像“0000000000000000”或“你好!” (你好!需要先转成二进制)

标签: c# .net serialization


【解决方案1】:

如果您可以在代码中区分字符串和字节[],则可以添加另一个属性来处理序列化,并设置 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";
            }
        } 
    }
}

【讨论】:

  • 我希望在特殊属性上有一种类似于“预解析器”的功能,这样我就可以单独保留课程,但如果 24 小时内没有任何结果,这似乎是一个令人满意的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多