33

datacontractserializer에 관한 빠른 질문이 있습니다. 어쩌면 그것은 더 많은 물음 문제 일 것입니다. XML을 파일 스트림에 쓰는 코드 조각을 발견했습니다. 기본적으로 파일을 원하지 않고 문자열 출력 만 필요합니다.DataContractSerializer - xml을 문자열 (파일과 반대)로 어떻게 출력 할 수 있습니까?

public static string DataContractSerializeObject<T>(T objectToSerialize) 
{ 
    var fs = new FileStream("test.xml", FileMode.OpenOrCreate); 
    var serializer = new DataContractSerializer(typeof(T)); 
    serializer.WriteObject(fs, objectToSerialize); 
    fs.Close(); 
    return fs.ToString(); 
} 

fs.ToString()은 분명히 내가 찾고있는 것이 아닙니다. 어떤 문자열이나 작가 등, 적절한 문자열을 반환하고 파일을 만들지 않고 사용할 수 있습니까? 필자가 만든 파일 스트림을 XML로 보았습니다. 정확히 내가 찾고있는 XML입니다. XmlSerializer는 조금 이상한 XML을 작성했으며이 경우 DataContractSerializer의 출력을 선호합니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까? 이 같은

답변

60

무엇인가 -에 그것을 다시 읽어 후 MemoryStream로 출력을 넣어 : @ xr280xr에

public static string DataContractSerializeObject<T>(T objectToSerialize) 
{ 
    using(MemoryStream memStm = new MemoryStream()) 
    { 
     var serializer = new DataContractSerializer(typeof(T)); 
     serializer.WriteObject(memStm, objectToSerialize); 

     memStm.Seek(0, SeekOrigin.Begin); 

     using(var streamReader = new StreamReader(memStm)) 
     { 
      string result = streamReader.ReadToEnd(); 
      return result; 
     } 
    } 
} 
+2

외모를 너처럼 매개 변수가 변경되었습니다. memStm.Seek (0, SeekOrigin.Begin); – xar

+0

@xar : 네, 맞습니다. 그 실수를 발견해 주셔서 감사합니다. - 지금 고치 셨습니다. –

+0

이 솔루션은 불필요하게 utf8을 /에서 인코딩합니다. –

22

감사 초안에 내 잊어 StringWriter를 폐기 지적에 대해.

/// <summary> 
/// Converts this instance to XML. 
/// </summary> 
/// <returns>XML representing this instance.</returns> 
public string ToXml() 
{ 
    var serializer = new DataContractSerializer(this.GetType()); 
    using (var output = new StringWriter()) 
    using (var writer = new XmlTextWriter(output) { Formatting = Formatting.Indented }) 
    { 
     serializer.WriteObject(writer, this); 
     return output.GetStringBuilder().ToString(); 
    } 
} 
+1

StringWriter도 삭제해야합니다. – xr280xr

+5

누적 된 용도로만 사용할 수 있습니다. – StingyJack

+0

이것은 또한 DataContractSerializer (그리고 마찬가지로 XmlSerializer)의 훌륭한 확장 메서드가 될 것입니다. 'public static string WriteObjectToString (this DataContractSerializer serializer, object obj) {...}' – JamesFaix

18

그리고 더 쉽게 :

var serializer = new DataContractSerializer(typeof(T)); 
var sb = new StringBuilder(); 
using (var writer = XmlWriter.Create(sb)) 
{ 
    serializer.WriteObject(writer, objectToSerialize); 
    writer.Flush(); 
    return sb.ToString(); 
} 
2

내가 Patmarc_s에 의해 주어진 방법을 결합 제안 :

public static string DataContractSerializeObject<T>(T objectToSerialize) 
{ 
    using (var output = new StringWriter()) 
    using (var writer = new XmlTextWriter(output) {Formatting = Formatting.Indented}) 
    { 
     new DataContractSerializer(typeof (T)).WriteObject(writer, objectToSerialize); 
     return output.GetStringBuilder().ToString(); 
    } 
} 
+0

이것은 pat의 메소드로 marc_s의 메소드 서명을 사용합니다. – HappyNomad

0

@ 루트의 대답의 변형 :

var serializer = new DataContractSerializer(typeof(T)); 
var sb = new StringBuilder(); 
using (var writer = XmlWriter.Create(sb)) 
{ 
    serializer.WriteObject(writer, objectToSerialize); 
} 

return sb.ToString(); 
관련 문제