【问题标题】:Deserialize from string instead TextReader从字符串反序列化而不是 TextReader
【发布时间】:2011-01-21 19:16:22
【问题描述】:

我想更改我的代码:

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。

这可能吗?

【问题讨论】:

    标签: c# xml serialization


    【解决方案1】:
    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>(); 
    

    【讨论】:

    • 更好:public static T XmlDeserializeFromString(string objectData) { return (T)XmlDeserializeFromString(objectData, typeof(T)); }
    • 我可以从公共静态字符串 XmlSerializeToString(this object objectInstance) 中删除“this”吗??
    • 您可以删除“this”,但该方法不再是扩展方法。通过使该方法成为扩展方法,这是可能的: string s = "blah!";字符串 xml = s.XmlSerializeToString();注意:请务必在 usings 中引用包含扩展方法的静态类的命名空间,否则扩展方法将不起作用!使用 'this' 的唯一原因是使其成为扩展方法,删除它是完全安全的。
    • 您缺少“这个”。在您的第二种方法中使其显示为扩展。 public static T XmlDeserializeFromString&lt;T&gt;(this string objectData) { return (T)XmlDeserializeFromString(objectData, typeof(T)); }我要编辑主帖。
    • StringReader 是缺失的部分。谢谢。
    【解决方案2】:

    如果您将 XML 存储在字符串变量中,则可以使用 StringReader:

    var xml = @"<car/>";
    var serializer = new XmlSerializer(typeof(Car));
    using (var reader = new StringReader(xml))
    {
        var car = (Car)serializer.Deserialize(reader);
    }
    

    【讨论】:

    • using(var reader = new StringReader(xml)) return (Car)new XmlSerializer(typeof(Car)).Deserialize(reader);
    【解决方案3】:

    1-liner,将 XML 字符串 textYourType 作为预期的对象类型。与其他答案差别不大,只是压缩为 1 行:

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

    【讨论】:

    • 我会在使用后关闭 StringReader。
    【解决方案4】:
    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;
    }
    

    【讨论】:

      【解决方案5】:

      无耻抄袭 Generic deserialization of an xml string

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-16
        • 2013-01-16
        • 2012-03-19
        • 1970-01-01
        • 1970-01-01
        • 2022-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多