2011-08-29 106 views
0

陣列的我已經(使用XSD生成)如下面所定義的類:XmlSerialization類

[GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
[SerializableAttribute] 
[DebuggerStepThroughAttribute] 
[DesignerCategoryAttribute("code")] 
[XmlTypeAttribute(AnonymousType = true)] 
[XmlRootAttribute(IsNullable = false)] 
public class DataRequest 
{ 
    private string _serviceField; 
    private string _subscriptionField; 

    public string Service 
    { 
     get 
     { 
      return _serviceField; 
     } 
     set 
     { 
      _serviceField = value; 
     } 
    } 

    [XmlElement("Subscription"), DefaultValue(null)] 
    public string Subscription 
    { 
     get 
     { 
      return _subscriptionField; 
     } 
     set 
     { 
      _subscriptionField = value; 
     } 
    } 
} 

然後,我定義上述類的數組:

DataRequest[] requests = new DataRequest[2]; 
requests[0] = new DataRequest(); 
requests[1] = new DataRequest(); 
... 

我想要序列此陣列和結束與下面:

<SOAP-ENV:Body> 
    <DataRequest> 
     <Service>ServiceA</DataService> 
     <Subscription /> 
    </DataRequest> 
    <DataRequest> 
     <Service>ServiceB</DataService> 
     <Subscription /> 
    </DataRequest> 
    </SOAP-ENV:Body> 

然而,當我所說的下面,其中,輸入是數組:

XmlSerializer serializer = new XmlSerializer(typeof(input)); 
serializer.Serialize(writer, input); 

我得到如下:

<Soap-ENV:Body> 
    <ArrayOfDataRequest> 
     <DataRequest> 
     <Service>ServiceA</DataService> 
     <Subscription /> 
     </DataRequest> 
     <DataRequest> 
     <Service>ServiceB</DataService> 
     <Subscription /> 
     </DataRequest> 
    </ArrayOfDataRequest> 
    </Soap-ENV:Body> 

有一些方法可以讓我擺脫ArrayOfDataRequest元素,只是有實際的數組元素直接序列化?

+0

嘿本,我只是試過了,我得到了同樣的東西(ArrayOfDataRequest)。 – Flack

+0

我對使用xsd.exe工具生成的複雜類執行相同的操作。當序列化使用List ,然後使用List.ToArray()時,我發現最好的選擇。命令將List轉換爲數組。這避免了必須指定要串行化的數組的大小。 你也可以使用'XmlWriterSettings XmlSettings = new XmlWriterSettings();'然後'XmlSettings.'指定選項。 – MoonKnight

回答

0

請糾正我,如果我錯了,但我認爲這是完全正確的關於SOAP特定的序列化。 body標籤的直接子元素是參數的元素,在這種情況下是DataRequest對象的數組。當序列化程序將省略ArrayOf ...標記時,SOAP消息將包含兩個DataRequest類型的參數。

也許你可以指定爲什麼你需要這樣一個「破」的消息來爲你找到解決方案的實際問題?

+0

嗨eFloh。我正在與之交互的服務允許這樣一個破碎的SOAP請求,其中沒有單個核心根元素。我希望有一些方法可以修改我發送的請求,但是看起來像我需要將服務更改爲處理有效的xml。 – Flack

+0

在使用WCF時,您可能會使用自定義的[MessageFormatter](http://msdn.microsoft.com/zh-cn/library/ms733844.aspx)來完成此任務,可能會有這樣的事情來對asp.net Web引用進行分類也是。 – eFloh