我知道这个问题已经被问过很多次了,但是仍然没有一个好的解决方案。
有一个这样的对象:
public class DTO
{
public string Value;
}
我需要在Exporter应用中对其进行序列化,然后在Importer中进行反序列化。
对象的值可能包含对XML无效的字符(例如0x8)。我需要让Exporter删除此类字符,或者让Importer成功加载包含字符的对象。我不想在序列化之前清理对象,因为我有数十个对象,每个对象都有数十个字符串属性。
进口方。如果我在此处启用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();
}
好吧,如果我让无效的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
是否有一种方法可以在任一步骤中删除无效字符,并使对象的导入/导出没有错误?
答案 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; }
}
}