属性中包含无效字符的XML序列化和反序列化对象

时间:2019-04-18 20:19:21

标签: c# .net xml

我知道这个问题已经被问过很多次了,但是仍然没有一个好的解决方案。
有一个这样的对象:

public class DTO
{
    public string Value;
}

我需要在Exporter应用中对其进行序列化,然后在Importer中进行反序列化。
对象的值可能包含对XML无效的字符(例如0x8)。我需要让Exporter删除此类字符,或者让Importer成功加载包含字符的对象。我不想在序列化之前清理对象,因为我有数十个对象,每个对象都有数十个字符串属性。

  1. 进口方。如果我在此处启用CheckCharacters,则在序列化步骤中会出现错误。我看不到一种可以自定义控制所有字符串的方法。如果禁用它,那么XML将包含无效的char。

    XmlWriterSettings xmlWriterSettings = new XmlWriterSettings { CheckCharacters = false };
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(DTO));
    StringBuilder sb = new StringBuilder();
    DTO dto = new DTO { Value = Convert.ToChar(0x08).ToString() };
    
    using (XmlWriter xmlWriter = XmlWriter.Create(sb, xmlWriterSettings))
    {
        xmlSerializer.Serialize(xmlWriter, dto); 
        xmlWriter.Flush();
        xmlWriter.Close();
    }
    
  2. 好吧,如果我让无效的char进入XML,则无法在Import端处理它。即使CheckCharacters = false,也会在Deserialize()调用中发生错误:

    var _reader = XmlReader.Create(File.OpenText(path), new XmlReaderSettings() { CheckCharacters = false });
    _reader.MoveToContent();
    var outerXml = _reader.ReadOuterXml();
    xmlSerializer.Deserialize(new StringReader(outerXml)); <== getting error here
    

是否有一种方法可以在任一步骤中删除无效字符,并使对象的导入/导出没有错误?

2 个答案:

答案 0 :(得分:1)

那是我的坏事:(
在这里:

var outerXml = _reader.ReadOuterXml();
xmlSerializer.Deserialize(new StringReader(outerXml)); <== getting error here

xmlSerializer实际上是使用隐式创建的内部XmlReader来检查字符。我四个小时前要做的就是:

xmlSerializer.Deserialize(_reader);

答案 1 :(得分:0)

我并不是说这是一个很好的解决方案,但是下面的代码将在序列化时删除非UTF8字符:

    public class DTO
    {
        private string _value { get; set; }
        public string Value
        {
            get { return Encoding.UTF8.GetString(_value.Select(x => (byte)((int)x)).ToArray()); }
            set { _value = value; }
        }

    }