2011-11-28 46 views
0

我正在使用XmlSerializer,並且想知道是否有任何方法,使用重寫或某種效果來獲取XmlSerializer以輸出某些節點的類型。XmlSerializer輸出xml類型

我的問題是我已經序列化了一個字節數組。

class MyClass { 
    public string Name { get; set; } 
    public byte[] Bytes { get; set; } 
} 

我正在使用通用服務中的xml。 服務將xml收集爲。

<MyClass> 
    <Name>Test</Name> 
    <Bytes>U2NhcnkgQnVnZ2Vy</Bytes> 
</MyClass> 

有什麼辦法可以在運行時生成xsd,或者以某種方式輸出這樣的東西。

我不能改變我正在序列化的類,但我可以覆蓋序列化器或以其他方式控制序列化。

<Bytes xsi:type='BinaryOfSomeKind'>BlahBlah</Bytes> 

我需要知道數據是二進制的。

謝謝

克雷格。

+0

我不知道我是否正確理解您的問題。你是否正在使用一個具有相同結構的XML,但元素的類型可能有所不同? –

+0

我正在將一個類轉換爲xml。班級由第三方提供。我正在接受xml和索引內容。我需要知道哪些字段是二進制的。如果有一個簡單的方法來生成一個xsd我也可以接受。我可以提供代碼來生成xsd。也許這是一個愚蠢的問題。 – Jim

+0

如果您的課程由第三方提供,那麼您知道您的屬性和屬性類型,並且可以從中推導出您的XML。您甚至可以手動爲其創建XSD。 –

回答

0

如果你的類由第三方提供,那麼你知道你的屬性和屬性類型,你可以從中推導出你的XML和XSD。您可以手動創建您的XSD或藉助XML工具(例如XMLSpy(不是免費的BTW)或XMLFox)免費提供。

0

如果您知道xml將以您提出的問題的格式顯示,並且您的課程已準備就緒,您可以對其進行修飾以使其反序列化。

反序列化類:

[XmlTypeAttribute] 
[XmlRootAttribute("MyClass")] 
public class MyClass 
{ 
    [XmlElementAttribute("Name")] 
    public string Name { get; set; } 

    [XmlElementAttribute("Bytes")] 
    public byte[] Bytes { get; set; } 
} 

的Deserialzation方法

public static object Deserialize(string xml) 
{ 
     var deserializer = new System.Xml.Serialization.XmlSerializer(typeof(MyClass)); 
     using (var reader = XmlReader.Create(new StringReader(xml))) 
     { 
      return (MyClass)deserializer.Deserialize(reader); 
     } 
} 

Main方法

static void Main(string[] args) 
    { 
     string xml = @"<MyClass> 
     <Name>Test</Name> 
     <Bytes>U2NhcnkgQnVnZ2Vy</Bytes> 
     </MyClass>"; 

     MyClass obj = (MyClass)Deserialize(xml); 
     Console.ReadKey(); 

    } 

確保添加以下using語句:

using System.Xml.Serialization; 
using System.Xml; 

它用「Test」作爲字節數組將其反序列化爲obj。

如果您在運行時生成XSD,那麼您無法知道哪些屬性存在,這可能是使用反射來測試特定屬性,然後找出它們可能是什麼類型,是這是什麼你的後?

+0

嗨,不幸的是,這是行不通的。我沒有格式。我需要知道該字符串是二進制的。我需要將該類型添加到傳出的XML或生成架構或編寫我自己的序列化程序。你的解決方案是不夠的。我很清楚,如果我知道它的二進制文件,序列化程序就可以工作,但我不知道。 – Jim

+0

所以你試圖控制'MyClass'是如何被序列化的,但是你根本不能裝飾這個類。但是你需要以你描述的格式輸出它?是對的嗎? – Chris

+0

我可以用任何屬性裝飾類,因爲它們可以在覆蓋中傳遞給序列化程序。我可以生成一個xsd。我可以反思我可以序列化課程的課程。我只需要知道二進制字段的xml類型是什麼。我想我會放棄序列化器並使用反射。我無法改變班級。班級由第三方提供。 – Jim

相關問題