나는 문제없이 XmlSerializer 클래스를 사용하여 .net 개체를 직렬화하고 비 직렬화했습니다. 그러나 이제는 다른 사람이 데이터를보고 분석 할 필요가 있습니다. 우리가 같이 우리의 클래스를 기반으로 XSD를 제작 한 그와 함께 돕기 위해.Net XML 직렬화는 XSD를 기반으로합니까?
: xsd.exe/t : DataClass Assembly.exe
XSD를의 시작은 다음과 같습니다
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="DataClass" nillable="true" type="DataClass" />
<xs:complexType name="DataClass">
<xs:complexContent mixed="false">
<xs:extension base="BaseDataClass">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="StudyID" type="xs:string" />
<xs:element minOccurs="1" maxOccurs="1" name="Position" type="xs:int" />
<xs:element minOccurs="1" maxOccurs="1" name="IViewer" type="xs:string" />
XML이 (obj가 우리의 DataClass의 인스턴스 인 경우) 다음과 같이 생성됩니다
Dim xs As New XmlSerializer(obj.GetType)
Dim xmlTextWriter As New XmlTextWriter(memoryStream, Encoding.UTF8)
xs.Serialize(xmlTextWriter, obj)
...이처럼 보이는 XML을 생성합니다
<?xml version="1.0" encoding="utf-8"?>
<DataClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Version>SixMonthQ-E1</Version>
<IViewer xsi:nil="true" />
<Language xsi:nil="true" />
...
<StudyID>12345</StudyID>
현저하게, 생성 된 XML은 동일한 클래스에서 생성 된 XSD를 따르지 않습니다.
내 질문에, 거기에 주어진 XSD를 기반으로 개체를 serialize하는 XmlSerializer 말하는 방법이 있나요?
제쳐두고이 문제를 수정하는 다른 방법을 살펴 보았습니다. 생성 된 XSD에서 클래스를 다시 생성하려고 시도했습니다. 동일한 문제가있는 것으로 보입니다. XmlElement 특성을 사용하여 요소의 순서를 명시 적으로 지정할 수 있지만 400 개 이상의 공용 속성에 대해서는 그렇게하지 않는 것이 좋습니다.
http://xsd2code.codeplex.com/는 클래스의 세부 사항을 게시하고, 전체 XSD하시기 바랍니다. 이 동일한 XSD에 따라 항상 직렬화되어야합니다. –
미안하지만, 그렇게 할 수는 없지만 관련 클래스를 새 프로젝트에 복사하기 시작했습니다. (게시 할 수있는 항목으로 잘라 내기 위해) 놀랍게도 새 프로젝트에서는 XML rpoduced는 스키마의 요소 순서와 일치합니다. 그 순서대로 XML을 생성하도록 강제하는 프로젝트에 특정한 뭔가가 있어야합니다 - 순서에 영향을 미칠 수있는 아이디어가 있습니까? 업데이트 된 코드에 대한 다른 점은 XML에 xsi : nil = "true"특성이 포함되어 있지만 생성 된 XSD에는 nillable = "true"특성이 없으므로 유효성 검사에 실패합니다! – Nik