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 メソッドをチェックするには、WebServiceType オブジェクトの配列をパラメーターとして取り、文字列を返すメソッド (unti テスト用) を作成する必要があります。このメソッドの書き方がわかりません。以下はサンプル文字列です。

サンプル 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' は、この宣言の種類では無効です。「property、indexer、field、param、return」宣言でのみ有効です。

追加する必要がある別の 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();
    }
}

ただし、ここで注意すべき点が 2 つあります。

  • 2 つの XML 文字列を比較しても、必要な結果が得られない場合があります。XML が技術的に同一であっても、意味のない空白のわずかな違いでも、文字列比較で false が返されます。たとえば、XML の次の 2 つのブロックは、XML の構造が同じであっても、文字列比較に失敗します。
<a><b>Text</b></a>

<a>
    <b>Text</b>
</a>
  • タグの名前が正しくない可能性があります。タグ<MethodCheck>は とと呼ばれます<WebService>タイプMethodCheckTypeはand と呼ばれ、異なるシリアル化された名前を付けるための属性WebServiceTypeがありません。これは、回答の冒頭で言及したものだと思います。xsd.exe は部分クラスを生成するため、生成されたクラスを拡張する別のソース ファイルを作成できます。例:[XmlElement]
[XmlElement(ElementName = "WebService")]
partial class WebServiceType
{
}

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

シリアル化と逆シリアル化は、分散アーキテクチャで主要な役割を果たします。簡単にするために、シリアル化とは、あるマシンから別のマシンに格納または転送できる方法でオブジェクトを文字列に転送することであり、その逆のプロセスは逆シリアル化であると言えます。

于 2012-07-13T10:07:01.643 に答える