0

我从 xsd.exe 生成了以下类。这就是为什么我不能只[XML Attribute("...")]在代码中添加类似的东西。

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 测试),该方法将 WebServiceType 对象数组作为参数并返回一个字符串。我不知道如何编写这个方法。下面是一个示例字符串:

示例 XML 文档

编辑: 这段文字似乎很难理解。我将尝试以更清晰的方式来表述它:我已经有了 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 { }

错误信息是:

属性“XmlElement”在此声明类型上无效。它仅对“属性、索引器、字段、参数、返回”声明有效。

我必须添加另一个 using 声明吗?或者为什么这不起作用?

4

2 回答 2

1

是的,您需要序列化(将对象转换为可以存储的某种表示形式,如字符串),而不是反序列化(将字符串或其他某种表示形式转换为内存中的对象)。

您的其他问题的答案已经为您提供了大部分您需要的东西。

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>。这些类型被称为MethodCheckTypeand WebServiceType,并且它们没有[XmlElement]属性可以赋予它们不同的序列化名称,我认为这就是您在答案开头所指的内容。因为 xsd.exe 会为您生成部分类,所以您可以创建另一个源文件扩展生成的类。例子:
[XmlElement(ElementName = "WebService")]
partial class WebServiceType
{
}

// And the same for MethodCheckType.
于 2012-07-13T10:04:52.080 回答
0

序列化和反序列化在分布式架构中发挥着重要作用。为了简单起见,您可以说序列化正在以一种可以存储或从一台机器传输到另一台机器的方式将对象转换为字符串,反之亦然,过程是反序列化。

于 2012-07-13T10:07:01.643 回答