2009-07-16 29 views
16

This example sử dụng một StringWriter để giữ dữ liệu tuần tự, sau đó gọi ToString() mang đến cho thực tế giá trị string:Tôi có thể tuần tự hóa XML thẳng thành chuỗi thay vì Luồng bằng C# không?

Person john = new Person(); 
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Person)); 
StringWriter stringWriter = new StringWriter(); 
xmlSerializer.Serialize(stringWriter, john); 
string serializedXML = stringWriter.ToString(); 

Có/cách Cleaner bất kỳ dễ dàng hơn để làm điều này? Tất cả các quá tải Serialize() dường như sử dụng Stream hoặc Writer.

CẬP NHẬT: Đã hỏi một câu hỏi tương tự về serializing an IEnumerable via an Extension Method.

Trả lời

33

Fun với phương pháp khuyến nông ...

var ret = john.ToXmlString() 

public static class XmlTools 
{ 
    public static string ToXmlString<T>(this T input) 
    { 
     using (var writer = new StringWriter()) 
     { 
      input.ToXml(writer); 
      return writer.ToString(); 
     } 
    } 
    public static void ToXml<T>(this T objectToSerialize, Stream stream) 
    { 
     new XmlSerializer(typeof(T)).Serialize(stream, objectToSerialize); 
    } 

    public static void ToXml<T>(this T objectToSerialize, StringWriter writer) 
    { 
     new XmlSerializer(typeof(T)).Serialize(writer, objectToSerialize); 
    } 
} 
+1

bị đánh ... bởi ... 9 ... giây ... aaarrrggghhh! –

+0

Ah vâng! Hoàn toàn quên mất điều đó! –

+0

yay ... Tôi thường là người đăng ký muộn để đảm bảo mã của tôi hoạt động trước khi gửi. –

4

Tôi đã tạo phương thức trợ giúp này, nhưng chưa thử nghiệm. Cập nhật mã một cảm orsogufo của (hai lần):

private string ConvertObjectToXml(object objectToSerialize) 
{ 
    XmlSerializer xmlSerializer = new XmlSerializer(objectToSerialize.GetType()); 
    StringWriter stringWriter = new StringWriter(); 

    xmlSerializer.Serialize(stringWriter, objectToSerialize); 

    return stringWriter.ToString(); 
} 
+0

Bạn đang sử dụng Convert.ChangeType cho mục đích gì? –

+0

Vì một lý do nào đó mà tôi có trong đầu rằng tôi cần phải đưa nó trở lại đúng loại ... nhưng tôi nghĩ bạn nói đúng, không cần thiết. Mã sẽ được cập nhật. –

+0

Infact no, serializer lấy một đối tượng chung làm tham số (do đó chuyển đổi thêm của bạn bị lãng phí). Cũng lưu ý rằng bạn không cần phải chuyển loại một cách rõ ràng, bạn có thể yêu cầu đối tượng là loại của nó. Trừ khi, tất nhiên, bạn muốn serialize một đối tượng như là một đối tượng của một loại khác nhau (không thể nhìn thấy lý do tại sao bạn sẽ muốn điều đó, nhưng bạn không bao giờ biết). –

6

Nhiều hơn hoặc ít hơn cùng một giải pháp của bạn, chỉ cần sử dụng một phương pháp khuyến nông:

static class XmlExtensions { 

    // serialize an object to an XML string 
    public static string ToXml(this object obj) { 
     // remove the default namespaces 
     XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
     ns.Add(string.Empty, string.Empty); 
     // serialize to string 
     XmlSerializer xs = new XmlSerializer(obj.GetType()); 
     StringWriter sw = new StringWriter(); 
     xs.Serialize(sw, obj, ns); 
     return sw.GetStringBuilder().ToString(); 
    } 

} 

[XmlType("Element")] 
public class Element { 
    [XmlAttribute("name")] 
    public string name; 
} 

class Program { 
    static void Main(string[] args) { 
     Element el = new Element(); 
     el.name = "test"; 
     Console.WriteLine(el.ToXml()); 
    } 
} 
+0

+1 cho một cách khác để làm việc, và một ví dụ hoàn chỉnh! –

+0

Điều này thiếu 'using' xung quanh' StringWriter', nó có thể không gây ra bất kỳ vấn đề nào trong trường hợp này, nhưng nó luôn luôn nên có trong trường hợp nó được thay đổi để lấy một luồng. – NiKiZe

1

Có vẻ như không có cơ thể thực sự là nswered câu hỏi của mình, đó là không có, không có cách nào để tạo ra một chuỗi XML mà không cần sử dụng một dòng hoặc đối tượng nhà văn.

+0

Vì 'Serializer' sử dụng viết nội bộ nên nó không thể lấy một' String' hoặc 'StringBuilder' trực tiếp,' StringWriter' về cơ bản không có phí, do đó, không thấy bất kỳ vấn đề nào với điều này. – NiKiZe

Các vấn đề liên quan