2012-07-13 47 views
0

我從xsd.exe生成了以下類。這就是爲什麼我不能在代碼中添加[XML Attribute("...")]之類的東西。將自動生成的類序列化爲XML字符串的示例

public partial class MethodCheckType { 

    private WebServiceType[] webServiceField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("WebService")] 
    public WebServiceType[] WebService { 
     get { 
      return this.webServiceField; 
     } 
     set { 
      this.webServiceField = value; 
     } 
    } 
} 

public partial class WebServiceType { 

    private string uRLField; 

    private string parameterField; 

    private string returnValueField; 

    private CredentialsType credentialsField; 

    /// <remarks/> 
    public string URL { 
     get { 
      return this.uRLField; 
     } 
     set { 
      this.uRLField = value; 
     } 
    } 

    /// <remarks/> 
    public string Parameter { 
     get { 
      return this.parameterField; 
     } 
     set { 
      this.parameterField = value; 
     } 
    } 

    /// <remarks/> 
    public string ReturnValue { 
     get { 
      return this.returnValueField; 
     } 
     set { 
      this.returnValueField = value; 
     } 
    } 

    /// <remarks/> 
    public CredentialsType Credentials { 
     get { 
      return this.credentialsField; 
     } 
     set { 
      this.credentialsField = value; 
     } 
    } 
} 

也許我必須改變我的XSD文件,然後我不得不再次在類代碼中寫這個。

爲了更好地理解它:我想證明另一種方法(下面的方法「ReadXml」)正確工作。

/// <summary> 
/// Reads an XML File in an array of WebServiceType objects. 
/// </summary> 
/// <param name="path">The filename to read.</param> 
/// <returns>An array of WebServiceType Objects.</returns> 
public static WebServiceType[] ReadXml(string path) 
{ 
    // Is the path NOT a valic UNC path? 
    if (!IsValidPath(path)) 
    { 
     Console.Write(MethodCheck.Properties.Resources.ERR003); 
     return null; 
    } 

    XmlSerializer serializer = new XmlSerializer(typeof(MethodCheckType)); 
    MethodCheckType output = null; 
    StringReader reader = null; 

    try 
    { 
     reader = new StringReader(path); 
     output = (MethodCheckType)serializer.Deserialize(reader); 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
    finally 
    { 
     reader.Dispose(); 
    } 

    return output.WebService; 
} 

要檢查ReadXml方法我必須寫的方法(unti測試)這需要作爲PARAMS WebServiceType對象的數組的返回一個字符串。我不知道如何寫這個方法。下面是一個示例字符串:

Sample Xml Document

編輯: 本文似乎很難理解。我會嘗試以更清晰的方式來制定它: 我已經有了ReadXml方法。要證明它是否工作正確與否我編寫一個測試方法:

/// <summary> 
///A test for ReadXml 
///</summary> 
[TestMethod()] 
public void ReadXmlTest2() 
{ 
    string path = @"C:\Users\pp-admin\Documents\Visual Studio 2010\Methodenpruefung der Webservices\Methodenpruefung\Methodenpruefung\BeispielXmlDatei.xml"; 
    string expected = testXMLFile; 
    string actual; 
    WebServiceType[] xmlSerialized = WebserviceReader.ReadXml(path); 
    // Deserialisieren des XML Objekts um einen String zu bekommen 
    actual = WebServiceType.SerializeToXml(xmlSerialized); 
    Assert.AreEqual(expected, actual); 
    Assert.Inconclusive("Verify the correctness of this test method."); 
} 

的方法SerializeToXml必須採取WebServiceType對象的數組,但它應該返回示例所示喜歡它的一個完整的XML字符串。

/// <summary> 
/// This method deserializes an arrayof WebServiceType objects into a XML string. 
/// </summary> 
/// <param name="services">The WebServiceType object to deserialize.</param> 
/// <returns>A XML string.</returns> 
public static string SerializeToXml(WebServiceType[] services) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(MethodCheckType)); 
    MemoryStream ms = null; 
    StreamReader reader = null; 
    StringBuilder builder = new StringBuilder(); 

    try 
    { 
     ms = new MemoryStream(); 
     reader = new StreamReader(ms); 
     Object t = (Object)serializer.Deserialize(reader); 
    } 
    finally 
    { 
     reader.Dispose(); 
     ms.Dispose(); 
    } 
    return null; 
} 

也許在我身邊有些混淆「序列化」和「反序列化」是什麼意思,對不起。但是我希望現在我明白我的意思。

編輯: 首先感謝以下答案。 SerializeToXml方法現在似乎工作。

還有一個問題:用下面的代碼我得到一個錯誤:

[XmlElement(ElementName = "MethodCheck")] 
public partial class MethodCheckType { } 

的錯誤信息是:

Attribute 'XmlElement' is not valid on this declaration type. Its only valid on 'property, indexer, field, param, return' declarations.

難道還有另一種使用聲明我要補充的嗎?或者爲什麼這不起作用?

+0

你能看到我的樣本串的照片嗎?我不能。 – FluepkeSchaeng 2012-07-13 08:35:47

+0

感謝您糾正空白。 – FluepkeSchaeng 2012-07-13 08:56:05

+0

我不確定你在問什麼。你的意思是你需要採取的陣列的方法'WebServiceType'和串行化* *他們爲XML字符串,這樣的ReadXml可以deserialise他們,你測試你回來的對象是一樣的嗎? – shambulator 2012-07-13 09:00:20

回答

1

是的,你需要還原序列化(把物體插入一定的代表性,可以存儲,就像一個字符串),而不是deserialise(把字符串或其他一些代表爲對象在內存中)。

answer to your other question已經給你你需要的大部分。

public static string SerializeToXml(WebServiceType[] webServices) 
{ 
    // Make a MethodCheck object to hold the services. 
    // This ensures that you get a top-level <MethodCheck> tag in the XML. 
    MethodCheckType container = new MethodCheckType(); 
    container.WebService = webServices; 

    using (var writer = new StringWriter()) 
    { 
     var serializer = new XmlSerializer(typeof(MethodCheckType)); 
     // Note that you're serializing, not deserializing. 
     serializer.Serialize(writer, container); 
     writer.Flush(); 
     return writer.ToString(); 
    } 
} 

然而,有兩件事情要小心這裏:

  • 比較兩個XML字符串中可能不會給你你想要的結果。即使XML在技術上是相同的,即使是在微不足道空白最小的差異將導致字符串比較返回false。例如,XML的這兩個區塊將失敗字符串比較,儘管XML具有相同的結構:
<a><b>Text</b></a> 

<a> 
    <b>Text</b> 
</a> 
  • 標籤的名稱可能是不對的。該標籤被稱爲<MethodCheck><WebService>。該類型被稱爲MethodCheckTypeWebServiceType,他們有沒有[XmlElement]屬性,給他們不同的系列化的名字,我認爲這是你在你的答案的開頭提到的內容。因爲XSD.EXE爲您生成部分類,可以創建另一個源文件延伸生成的類。例如:
[XmlElement(ElementName = "WebService")] 
partial class WebServiceType 
{ 
} 

// And the same for MethodCheckType. 
0

序列化和反序列化發揮分佈式架構中的重要作用。爲了簡簡單單就可以說序列化的方式,它可以儲存或從一臺機器轉移到另一反之亦然過程中移動目標對象字符串是反序列化。