XML (de)serialization invalid string inconsistent in c#?

前端 未结 1 1887
故里飘歌
故里飘歌 2020-12-13 21:46

In C# (.net 4.0 and 4.5 / vs2010 and vs12) when I serialize an object containing a string having an illegal character using XMLSerializer, no error is thrown. However, when

相关标签:
1条回答
  • 2020-12-13 22:01

    1.

    You can set XmlWriterSettings's CheckCharacters property to avoid writing illegal chars.(Serialize method would throw exception)

    using (FileStream tmpFileStream = new FileStream(tmpFile, FileMode.OpenOrCreate, FileAccess.ReadWrite))
    {
        var writer = XmlWriter.Create(tmpFileStream, new XmlWriterSettings() { CheckCharacters = true});
        serializer.Serialize(writer, items);
    }
    

    2.

    You can create your own XmlTextWriter to filter out unwanted chars while serializing

    using (FileStream tmpFileStream = new FileStream(tmpFile, FileMode.OpenOrCreate, FileAccess.ReadWrite))
    {
        var writer = new MyXmlWriter(tmpFileStream);
        serializer.Serialize(writer, items);
    }
    
    public class MyXmlWriter : XmlTextWriter
    {
        public MyXmlWriter(Stream s) : base(s, Encoding.UTF8)
        {
        }
    
        public override void WriteString(string text)
        {
            string newText = String.Join("", text.Where(c => !char.IsControl(c)));
            base.WriteString(newText);
        }
    }
    

    3.

    By creating your own XmlTextReader you can filter out unwanted chars while deserializing

    using (FileStream plainTextFile = new FileStream(tmpFile, FileMode.Open, FileAccess.Read))
    {
        var reader = new MyXmlReader(plainTextFile);
        result = (SomeObject)serializer.Deserialize(reader); 
    }
    
    public class MyXmlReader : XmlTextReader
    {
        public MyXmlReader(Stream s) : base(s)
        {
        }
    
        public override string ReadString()
        {
            string text =  base.ReadString();
            string newText = String.Join("", text.Where(c => !char.IsControl(c)));
            return newText;
        }
    }
    

    4.

    You can set XmlReaderSettings's CheckCharacters property to false. Deserialization will work now smoothly. (you'll get \v back.)

    using (FileStream plainTextFile = new FileStream(tmpFile, FileMode.Open, FileAccess.Read))
    {
        var reader = XmlReader.Create(plainTextFile, new XmlReaderSettings() { CheckCharacters = false });
        result = (SomeObject)serializer.Deserialize(reader); 
    }
    
    0 讨论(0)
提交回复
热议问题