web-dev-qa-db-ja.com

オブジェクトをXML文字列に変換します

XSDファイルのツールxsd.exeから取得したWebserviceTypeという名前のクラスがあります。

ここで、WebServiceTypeオブジェクトのインスタンスを文字列に逆シリアル化したいと思います。これどうやってするの?

MethodCheckTypeオブジェクトには、パラメーターとしてWebServiceType配列があります。

最初の試みは、XmlSerializerStringWriterでシリアル化したようなものでした(シリアル化中はStringReaderを使用しました)。

これは、WebServiceTypeオブジェクトをシリアル化する方法です。

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

        // catch global exception, logg it and throw it
        try
        {
            reader = new StringReader(path);
            output = (MethodCheckType)serializer.Deserialize(reader);
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            reader.Dispose();
        }

        return output.WebService;

編集:

別の言葉で言ってもいいかもしれません。このMethodCheckTypeオブジェクトのインスタンスを取得している一方で、このオブジェクトをシリアル化したXMLドキュメントを取得しています。次に、このインスタンスを文字列形式のXMLドキュメントに変換します。この後、(XMLドキュメントの)両方の文字列が同じかどうかを証明する必要があります。これは、XMLドキュメントをStringReaderに読み取り、それをMethodCheckTypeオブジェクトにシリアル化する最初のメソッドのユニットテストを行うためです。

77
FluepkeSchaeng

以下は、両方の方法の変換方法です。 this =クラスのインスタンス

public string ToXML()
    {
        using(var stringwriter = new System.IO.StringWriter())
        { 
            var serializer = new XmlSerializer(this.GetType());
            serializer.Serialize(stringwriter, this);
            return stringwriter.ToString();
        }
    }

 public static YourClass LoadFromXMLString(string xmlText)
    {
        using(var stringReader = new System.IO.StringReader(xmlText))
        {
            var serializer = new XmlSerializer(typeof(YourClass ));
            return serializer.Deserialize(stringReader) as YourClass ;
        }
    }
165
Tomas Grosup

これは非常に古い投稿であることに気づきましたが、LBの回答を見た後、受け入れられた回答をどのように改善し、自分のアプリケーションに汎用的にすることができるかを考えました。ここに私が思いついたものがあります:

public static string Serialize<T>(T dataToSerialize)
{
    try
    {
        var stringwriter = new System.IO.StringWriter();
        var serializer = new XmlSerializer(typeof(T));
        serializer.Serialize(stringwriter, dataToSerialize);
        return stringwriter.ToString();
    }
    catch
    {
        throw;
    }
}

public static T Deserialize<T>(string xmlText)
{
    try
    {
        var stringReader = new System.IO.StringReader(xmlText);
        var serializer = new XmlSerializer(typeof(T));
        return (T)serializer.Deserialize(stringReader);
    }
    catch
    {
        throw;
    }
}

これらのメソッドは、静的ヘルパークラスに配置できるようになりました。つまり、シリアル化する必要のあるすべてのクラスにコードが重複することはありません。

71
William Smith
    public static string Serialize(object dataToSerialize)
    {
        if(dataToSerialize==null) return null;

        using (StringWriter stringwriter = new System.IO.StringWriter())
        {
            var serializer = new XmlSerializer(dataToSerialize.GetType());
            serializer.Serialize(stringwriter, dataToSerialize);
            return stringwriter.ToString();
        }
    }

    public static T Deserialize<T>(string xmlText)
    {
        if(String.IsNullOrWhiteSpace(xmlText)) return default(T);

        using (StringReader stringReader = new System.IO.StringReader(xmlText))
        {
            var serializer = new XmlSerializer(typeof(T));
            return (T)serializer.Deserialize(stringReader);
        }
    }

これは私のソリューションです。リストオブジェクトの場合、このコードを使用してxmlレイアウトに変換できます。 KeyFatherが主要タグであり、KeySonがForechの開始点です。

public string BuildXml<T>(ICollection<T> anyObject, string keyFather, string keySon)
    {
        var settings = new XmlWriterSettings
        {
            Indent = true
        };
        PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
        StringBuilder builder = new StringBuilder();
        using (XmlWriter writer = XmlWriter.Create(builder, settings))
        {
            writer.WriteStartDocument();
            writer.WriteStartElement(keyFather);
            foreach (var objeto in anyObject)
            {
                writer.WriteStartElement(keySon);
                foreach (PropertyDescriptor item in props)
                {
                    writer.WriteStartElement(item.DisplayName);
                    writer.WriteString(props[item.DisplayName].GetValue(objeto).ToString());
                    writer.WriteEndElement();
                }
                writer.WriteEndElement();
            }
            writer.WriteFullEndElement();
            writer.WriteEndDocument();
            writer.Flush();
            return builder.ToString();
        }
    }
0
Fred Peixoto