요소를 찾을 수 없는 경우 C#에서 XmlSerializer를 사용하여 역직렬화에 실패할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/259726

문제

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 옵션이 표시되며 옵션이기도합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top