요소를 찾을 수 없는 경우 C#에서 XmlSerializer를 사용하여 역직렬화에 실패할 수 있습니까?
-
06-07-2019 - |
문제
XmlSerializer를 사용하여 C#에서 xml에 개체를 쓰고 읽습니다.현재 속성을 사용하고 있습니다. XmlElement
그리고 XmlIgnore
객체의 직렬화를 조작합니다.
내 xml 파일에 필요한 xml 요소가 누락되어도 내 개체는 여전히 문제 없이 역직렬화(xml -> 개체)됩니다.특정 필드가 "필수"임을 어떻게 표시합니까(가급적이면 속성을 통해)?
현재 내가 사용하고 있는 샘플 방법은 다음과 같습니다.
[XmlElement(ElementName="numberOfWidgets")]
public int NumberThatIsRequired {
set ...;
get ...;
}
내 이상적인 솔루션은 다음과 같은 것을 추가하는 것입니다. XmlRequired
기인하다.
또한 XmlSerializer의 동작을 조작하는 데 사용할 수 있는 특성에 대한 좋은 참조가 있습니까?
해결책
두 번째 부분에 대한 답변을 얻었습니다. "XML 직렬화를 제어하는 속성".
아직 첫 번째 부분을 조사 중입니다...
편집하다:나는 XML 역직렬화 자체를 통해서는 이 작업을 수행할 수 없다고 강력하게 의심합니다.필수 속성이 포함된 샘플 스키마에서 xsd.exe를 실행했습니다. 속성이 선택 사항으로 표시된 경우에도 마찬가지입니다.속성 설정을 요구하는 방법이 있다면 그 경우에 구현될 것으로 기대합니다.
기본적으로 개체 트리를 역직렬화한 후에 유효성을 검사해야 한다고 생각합니다.미안합니다...
다른 팁
내가 이것을하는 유일한 방법은 XSD를 통한 것입니다. 당신이 할 수있는 일은 당신이 사형화하는 동안 검증하는 것입니다.
static T Deserialize<T>(string xml, XmlSchemaSet schemas)
{
//List<XmlSchemaException> exceptions = new List<XmlSchemaException>();
ValidationEventHandler validationHandler = (s, e) =>
{
//you could alternatively catch all the exceptions
//exceptions.Add(e.Exception);
throw e.Exception;
};
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(schemas);
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += validationHandler;
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (StringReader sr = new StringReader(xml))
using (XmlReader books = XmlReader.Create(sr, settings))
return (T)serializer.Deserialize(books);
}
확장 성 이유로 XmlSerializer
사막화에 관해서는 매우 용서합니다. 같은 것들 [DefaultValue]
, ShouldSerialize{Foo}
그리고 {Foo}Specified
~이다 주로 사용 중 직렬화 (예외 {Foo}Specified
, 이는 직렬화 중에 쿼리뿐만 아니라 사막화 중에 설정됩니다).
따라서; 구현하지 않는 한이 작업을 수행하는 쉬운 방법은 없습니다. IXmlSerializable
그리고 직접하십시오. DamagedNoob에는 XSD 옵션이 표시되며 옵션이기도합니다.