从字符串反序列化而不是从TextReader反序列化

153

我想将我的代码从:

string path = @"c:\Directory\test.xml";
XmlSerializer s = new XmlSerializer(typeof(Car));

TextReader r = new StreamReader(path);

Car car = (Car)s.Deserialize(r);
r.Close();

我需要将XML转换为字符串,然后将字符串转换为对象Car的代码。

这个可行吗?

5个回答

287
public static string XmlSerializeToString(this object objectInstance)
{
    var serializer = new XmlSerializer(objectInstance.GetType());
    var sb = new StringBuilder();

    using (TextWriter writer = new StringWriter(sb))
    {
        serializer.Serialize(writer, objectInstance);
    }

    return sb.ToString();
}

public static T XmlDeserializeFromString<T>(this string objectData)
{
    return (T)XmlDeserializeFromString(objectData, typeof(T));
}

public static object XmlDeserializeFromString(this string objectData, Type type)
{
    var serializer = new XmlSerializer(type);
    object result;

    using (TextReader reader = new StringReader(objectData))
    {
        result = serializer.Deserialize(reader);
    }

    return result;
}

使用它:

//Make XML
var settings = new ObjectCustomerSettings();
var xmlString = settings.XmlSerializeToString();

//Make Object
var settings = xmlString.XmlDeserializeFromString<ObjectCustomerSettings>(); 

4
公共静态方法 T XmlDeserializeFromString<T>(string objectData) { return (T)XmlDeserializeFromString(objectData, typeof(T)); } (说明:该代码段是一个泛型方法,用于将XML字符串反序列化为指定类型的对象,并返回该对象。) - Lee Treveil
1
我可以从以下代码中删除“this”吗?public static string XmlSerializeToString(this object objectInstance) - user278618
你可以移除 'this',但这样方法就不再是扩展方法了。通过将方法变成扩展方法,这是可能的:string s = "blah!"; string xml = s.XmlSerializeToString();注意:确保在你的 usings 中引用包含扩展方法的静态类的命名空间,否则扩展方法将无法工作!使用 'this' 的唯一原因是使它成为扩展方法,完全可以安全地将其移除。 - Elmer
你在第二个方法中漏写了“this”,导致它不能作为扩展显示。public static T XmlDeserializeFromString<T>(this string objectData) { return (T)XmlDeserializeFromString(objectData, typeof(T)); }我将编辑主贴。 - Omzig
StringReader是缺失的部分。谢谢。 - primo

93
如果你有存储在字符串变量中的XML,你可以使用 StringReader
var xml = @"<car/>";
var serializer = new XmlSerializer(typeof(Car));
using (var reader = new StringReader(xml))
{
    var car = (Car)serializer.Deserialize(reader);
}

1
使用(var reader = new StringReader(xml))返回(Car)new XmlSerializer(typeof(Car)).Deserialize(reader); - Aelphaeis

17

这是一行代码,接受一个XML字符串text和预期对象类型YourType。与其他答案并没有太大区别,只是将其压缩成了一行:

var result =  (YourType)new XmlSerializer(typeof(YourType)).Deserialize(new StringReader(text));

6
使用完StringReader后,我会关闭它。 - cederlof

8
static T DeserializeXml<T>(string sourceXML) where T : class
{
    var serializer = new XmlSerializer(typeof(T));
    T result = null;

    using (TextReader reader = new StringReader(sourceXML))
    {
        result = (T) serializer.Deserialize(reader);
    }

    return result;
}

6

以下内容是从通用XML字符串反序列化中抄袭而来:

    public static T DeserializeFromXmlString<T>(string xmlString)
    {
        var serializer = new XmlSerializer(typeof(T));
        using (TextReader reader = new StringReader(xmlString))
        {
            return (T) serializer.Deserialize(reader);
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接