这篇文章
https://stackoverflow.com/a/1708614/5333340
给出了在反序列化过程中如何验证xml的解决方案。它还说可以为序列化编写类似的代码,但我没有弄清楚。
有人能给个提示吗?
我想在序列化过程中进行验证,这样,如果验证在某个点失败,序列化就会立即停止。
根据链接的答案,我的反序列化代码(进行验证的地方)如下所示:
private static readonly XmlSerializer _topSerializer = new XmlSerializer(typeof(top));
private static readonly XmlSettings _settings = ...
// same as in the linked post, only without `ValidationEventHandler` set
public static top Deserialize(Stream strm)
{
using (StreamReader input = new StreamReader(strm))
{
using (XmlReader reader = XmlReader.Create(input, _settings))
{
return (top)_topSerializer.Deserialize(reader);
}
}
}
班级
top
是表示xml模式根元素的类;我用xsd.exe文件.
这非常有效;当xml不符合模式时,我得到一个
XmlSchemaValidationException
.
为了将这种方法转移到我当前的序列化代码中
(在没有进行验证的情况下),如下所示
public static void Serialize(top t, Stream strm)
{
using (XmlWriter wr = XmlWriter.Create(strm))
{
_topSerializer.Serialize(wr, t);
}
}
,我需要把
XmlReader
在某个地方,因为它是
XML阅读器
这是验证所需要的。
但是在哪里,怎么做?这个
XmlReader.Create
方法需要
TextReader
或者
Stream
作为输入,所以我假设在
XML阅读器
我能读懂。所以呢
using (XmlReader reader = XmlReader.Create(strm, _settings))
{
using (XmlWriter wr = XmlWriter.Create(strm))
{
_topSerializer.Serialize(wr, t);
}
}
不会验证生成的xml,因为流通过
XML阅读器
. 只有在调用
_topSerializier.Serialize
,所以在它之后阅读是有意义的。但是,在里面放什么呢?
using (XmlWriter wr = XmlWriter.Create(strm))
{
_topSerializer.Serialize(wr, t);
using (XmlReader reader = XmlReader.Create(strm, _settings))
{
// what to do here?
}
}
(此代码也不验证。)