将对象转换为XML字符串

Flu*_*eng 78 c# xml serialization

我有一个名为WebserviceType我从XSD文件中的工具xsd.exe 获得的类.

现在我想将WebServiceType对象的实例反序列化为字符串.我怎样才能做到这一点?

MethodCheckType对象具有params WebServiceType数组.

我的第一次尝试就像我序列化了一样:a XmlSerializer和a StringWriter(序列化我使用了a 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;
Run Code Online (Sandbox Code Playgroud)

编辑:

也许我可以用不同的语言说:我有一个这个MethodCheckType对象的实例另一方面我有一个XML文档,我从中序列化了这个对象.现在我想以字符串的形式将此实例转换为XML文档.在此之后,我必须证明两个字符串(XML文档)是否相同.我必须这样做,因为我对第一种方法进行单元测试,在该方法中我将XML文档读入StringReader并将其序列化为MethodCheckType对象.

Tom*_*sup 168

这是两种方式的转换方法.这是你班级的实例

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 ;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 您应该使用`using`模式或调用`Dispose`方法来正确释放资源. (12认同)
  • 您可以使用`generics`来使您的代码更通用:) (4认同)
  • 为什么?因为您应该处理资源密集型的所有内容(非托管和**托管**).只是因为垃圾收集器会为你清理(最终)并不意味着你应该让它的工作过于困难.随着你的进行清理,你的代码会更有效率.[更多信息为什么显式处理在这里是一个好主意](http://stackoverflow.com/a/538193/542251) (3认同)

Wil*_*ith 74

我意识到这是一个非常古老的帖子,但在看了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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在可以将这些方法放在静态助手类中,这意味着不需要对每个需要序列化的类进行代码复制.

  • 在"Serialize"方法中,使用dataToSerialize.GetType()而不是typeof(T).乍一看,使用T作为类型似乎是安全的,但如果"dataToSerialize"对象已被强制转换为父类型(ChildClass强制转换为BaseClass),则会抛出错误.当然首先检查它是否为null. (9认同)
  • 只接住然后重新扔而不做任何其他事情有什么意义? (2认同)

Ela*_*amy 19

    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);
        }
    }
Run Code Online (Sandbox Code Playgroud)