gpt4 book ai didi

c# - XmlSerializer 无法反序列化使用相同序列化程序序列化的 XML

转载 作者:行者123 更新时间:2023-11-30 23:28:02 24 4
gpt4 key购买 nike

我在使用 XML Serializer 时遇到一个奇怪的问题。如果序列化对象图包含带有换页符 (0x0C) 的字符串,序列化程序可以正确序列化它,但不能反序列化序列化表示。

这是概念证明:

static void Main (string[] args)
{
var original = "test\fbla";

var stringBuilder = new StringBuilder ();

using (var writer = new StringWriter (stringBuilder))
{
new XmlSerializer (typeof (string)).Serialize (writer, original);
}
var serialized = stringBuilder.ToString ();


string deserialized;
using (var reader = new StringReader (serialized))
{
deserialized = (string) new XmlSerializer (typeof (string)).Deserialize (reader);
}

Console.WriteLine (deserialized);
}

序列化后的字符串为:

<?xml version="1.0" encoding="utf-16"?>
<string>test&#xC;bla</string>

Deserialize 调用失败。这似乎是 XmlSerializer 中的错误,因为序列化字符串似乎格式正确。还是我做错了什么?

最佳答案

该字符在 XML 中在技术上是无效的(一个很好的问题是为什么作者不抛出这个异常......查看引用源,它使用 XmlTextWriter 而不是 XmlWriter,我认为默认情况下不检查字符?)。您需要为序列化程序提供一个 XmlReader,它被告知不要检查字符:

string deserialized;
XmlReaderSettings settings = new XmlReaderSettings();
// this will make the reader not barf on invalid characters
settings.CheckCharacters = false;
// can't just use a string reader here, otherwise the Serializer
// will use an XmlReader with default settings
using (var reader = XmlReader.Create(new StringReader(serialized), settings))
{
deserialized = (string)new XmlSerializer(typeof(string)).Deserialize(reader);
}

但是 - 如果您需要序列化可能/肯定包含 XML 中无效字符的字符串,您应该考虑使用不同的序列化格式(BinaryFormatter、JSON 或 Protocol Buffers 都来了根据您的要求/消费者介意)。没有好的方法可以保证您的下游消费者知道他们必须允许 XML 中的无效字符,并且一些消费者可能没有这样做的选择。

关于c# - XmlSerializer 无法反序列化使用相同序列化程序序列化的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36188037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com