Deserialize từ chuỗi thay vì TextReader


135

Tôi muốn thay đổi mã của mình từ:

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();

thành mã có thể chuyển đổi một XML thành một chuỗi và sau đó chuyển đổi chuỗi thành đối tượng Xe.

Điều này có thể không?

Câu trả lời:


259
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;
}

Để dùng nó:

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

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

4
Tốt hơn: công khai T XmlDeserializeFromString <T> (chuỗi objectData) {return (T) XmlDeserializeFromString (objectData, typeof (T)); }
Lee Treveil

1
Tôi có thể xóa "cái này" khỏi chuỗi tĩnh công khai XmlSerializeToString (đối tượng này objectInstance) ??
dùng278618

Bạn có thể xóa 'cái này', nhưng sau đó phương thức không còn là phương thức mở rộng nữa. Bằng cách biến phương thức thành phương thức mở rộng, điều này là có thể: chuỗi s = "blah!"; chuỗi xml = s.XmlSerializeToString (); lưu ý: hãy chắc chắn tham chiếu không gian tên của lớp tĩnh chứa các phương thức mở rộng trong cách sử dụng của bạn, hoặc các phương thức mở rộng sẽ không hoạt động! Lý do duy nhất để sử dụng 'cái này' là biến nó thành một phương thức mở rộng, nó hoàn toàn an toàn để loại bỏ nó.
Elmer

Bạn đang thiếu "cái này". trong phương thức thứ 2 của bạn để làm cho nó hiển thị như một phần mở rộng. public static T XmlDeserializeFromString<T>(this string objectData) { return (T)XmlDeserializeFromString(objectData, typeof(T)); }Tôi sẽ chỉnh sửa bài chính.
Omzig

StringReaderlà mảnh còn thiếu. Cảm ơn.
primo

83

Nếu bạn có XML được lưu trữ bên trong một biến chuỗi, bạn có thể sử dụng StringReader :

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

bằng cách sử dụng (var reader = new StringReader (xml)) return (Car) new XmlSerializer (typeof (Car)). Deserialize (reader);
Aelphaeis

15

1-liner, lấy một chuỗi XML textYourTypelàm loại đối tượng dự kiến. không khác lắm so với các câu trả lời khác, chỉ nén thành 1 dòng:

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

4
Tôi sẽ đóng StringReader sau khi sử dụng.
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

Sao chép một cách đáng xấu hổ từ việc khử lưu lượng chung của chuỗi 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);
        }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.