2009-10-20 17 views
5

मैं बिना किसी समस्या के XmlSerializer क्लास का उपयोग कर .net ऑब्जेक्ट्स serialising और deserialising रहा है, हालांकि अब हम उस डेटा को देखने के लिए किसी और को देखने के लिए किसी और की जरूरत है।एक्सएसडी पर आधारित नेट एक्सएमएल सीरियलाइजेशन?

आदेश उस के साथ मदद करने के लिए हम इतनी तरह हमारी कक्षा के आधार पर एक XSD का उत्पादन किया गया है: xsd.exe/टी: 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" /> 

एक्सएमएल इस तरह का उत्पादन किया है (जहां obj हमारे DataClass का एक उदाहरण है):

Dim xs As New XmlSerializer(obj.GetType) 
Dim xmlTextWriter As New XmlTextWriter(memoryStream, Encoding.UTF8) 
xs.Serialize(xmlTextWriter, obj) 

... जो इस तरह लग रही एक्सएमएल का उत्पादन:

<?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> 

विचित्र रूप से, एक्सएमएल उत्पादित उसी वर्ग से उत्पन्न एक्सएसडी का पालन नहीं करता है।

मेरा प्रश्न तब है, क्या एक्सएमएलएसरियलाइज़र को दिए गए एक्सएसडी के आधार पर ऑब्जेक्ट को क्रमबद्ध करने का कोई तरीका है?

एक तरफ, मैंने इसे ठीक करने के अन्य तरीकों को देखा है: मैंने उत्पन्न एक्सएसडी से कक्षाओं को पुन: उत्पन्न करने का प्रयास किया है - ऐसा लगता है कि यह एक ही समस्या है। मैं स्पष्ट रूप से XmlElement विशेषता का उपयोग कर तत्वों का ऑर्डरिंग कर सकता हूं, लेकिन मुझे 400+ सार्वजनिक गुणों के लिए ऐसा करने की कल्पना नहीं है।

+1

वर्गों के विवरण पोस्ट करें, और पूर्ण XSD। इसे हमेशा उसी एक्सएसडी के अनुसार क्रमबद्ध करना चाहिए। –

+1

क्षमा करें, मैं ऐसा नहीं कर सकता, लेकिन मैंने प्रासंगिक वर्गों को एक नई परियोजना में कॉपी करना शुरू कर दिया (इसे पोस्ट करने के लिए इसे नीचे करने के लिए इसे देखने के लिए), और आश्चर्यजनक रूप से, नई परियोजना में, तत्वों का क्रम एक्सएमएल rpoduced स्कीमा में तत्वों के क्रम से मेल खाता है। उस परियोजना के लिए कुछ विशिष्ट होना चाहिए जो एक्सएमएल को उस क्रम में उत्पादित करने के लिए मजबूर करता है - कोई विचार जो ऑर्डरिंग को प्रभावित कर सकता है? अद्यतन कोड के बारे में दूसरी बात यह है कि एक्सएमएल में xsi: nil = "true" विशेषताएं हैं, लेकिन जेनरेट किए गए एक्सएसडी में शून्य नहीं है = "सत्य" विशेषताएं - इसलिए यह अभी भी सत्यापन में विफल रहता है! – Nik

उत्तर

4

नहीं, क्षमा करें। ऐसा लगता है कि खाते में एक स्कीमा लेने के लिए XmlSerializer को मजबूर करने का कोई तरीका नहीं है।

xsd.exe का उपयोग करके कक्षाओं को पुन: उत्पन्न करने और इसे उत्पन्न स्कीमा (राउंडट्रिप रूपांतरण करने) का प्रयास करने का प्रयास करें।

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

कम से कम यह आपको मूल कक्षाओं के कौन सा पहलू xsd.exe कमांड में परेशानी के बारे में कुछ अंतर्दृष्टि दे सकता है।

इसके अलावा शायद XSD को यह विकल्प का प्रयास करें: http://xsd2code.codeplex.com/

+0

xsd2code ने मेरे लिए काम किया जबकि xsd.exe उपयुक्त कोड बनाने में विफल रहा, जो क्रमिकरण की प्रक्रिया में कुछ अजीब अपवादों में विफल रहा। – AgentFire

संबंधित मुद्दे