2009-10-20 6 views
5

나는 문제없이 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 개 이상의 공용 속성에 대해서는 그렇게하지 않는 것이 좋습니다.

+1

http://xsd2code.codeplex.com/는 클래스의 세부 사항을 게시하고, 전체 XSD하시기 바랍니다. 이 동일한 XSD에 따라 항상 직렬화되어야합니다. –

+1

미안하지만, 그렇게 할 수는 없지만 관련 클래스를 새 프로젝트에 복사하기 시작했습니다. (게시 할 수있는 항목으로 잘라 내기 위해) 놀랍게도 새 프로젝트에서는 XML rpoduced는 스키마의 요소 순서와 일치합니다. 그 순서대로 XML을 생성하도록 강제하는 프로젝트에 특정한 뭔가가 있어야합니다 - 순서에 영향을 미칠 수있는 아이디어가 있습니까? 업데이트 된 코드에 대한 다른 점은 XML에 xsi : nil = "true"특성이 포함되어 있지만 생성 된 XSD에는 nillable = "true"특성이 없으므로 유효성 검사에 실패합니다! – Nik

답변

4

아니요, 죄송합니다. XmlSerializer이 스키마를 고려하도록하는 방법이없는 것처럼 보입니다.

xsd.exe와 생성 한 스키마 (왕복 변환)를 사용하여 클래스를 다시 생성 해보십시오.

xsd.exe dataClass.xsd /classes /language:cs 

적어도 xsd.exe 명령에 문제가있는 원래 클래스의 측면에 대한 통찰력을 줄 수 있습니다.

또한 어쩌면 XSD이 대안을 시도 :

+0

xsd.exe가 적절한 코드를 작성하지 못하는 동안 xsd2code가 작동하여 직렬화 과정에서 이상한 예외가 발생하지 않았습니다. – AgentFire

관련 문제