2017-12-21 13 views
1

같은 주제로 토론을했지만 xml 형식의 개체를 serialize/deserialze하는 매우 간단한 작업에 대한 궁극적 인 해결책을 찾을 수 없습니다.개체 xml serialization/deserialization

내가으로 실행하는 문제는 다음과 같습니다

:

는 XML 문서 (2,2)

enter image description here

의 오류와 문제를 재현하는 코드가있다

public partial class Form1 : Form 
    { 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Serialize_Click(object sender, EventArgs e) 
    { 
     testclass t = new testclass(); 
     t.dummyInt = 10; 
     t.dummyString = "sssdf"; 
     textBox1.Text = t.SerializeObject(); 
    } 

    private void Deserialize_Click(object sender, EventArgs e) 
    { 
     try 
     { 
     object o = MySerializer.DeserializeObject<object>(textBox1.Text); 
     } 
     catch (Exception Ex) 
     { 
     MessageBox.Show(Ex.Message + Ex.InnerException, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 
    } 

public class testclass 
{ 
    public int dummyInt; 
    public string dummyString; 
    public testclass() { } 
} 

public static class MySerializer 
{ 
    public static string SerializeObject<T>(this T toSerialize) 
    { 
    XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType()); 
    using (StringWriter textWriter = new StringWriter()) 
    { 
     xmlSerializer.Serialize(textWriter, toSerialize); 
     return textWriter.ToString(); 
    } 
    } 

    public static T DeserializeObject<T>(string data) 
    { 
    XmlSerializer serializer = new XmlSerializer(typeof(T)); 

    using (StringReader sReader = new StringReader(data)) 
    { 
     return (T)serializer.Deserialize(sReader); 
    } 
    } 
} 

그래서 무엇이 잘못 되었나요?

+3

주세요. ovide xml, 내 끝에서 시도하고 싶다 –

+0

, 여기있다 : 10 sssdf

+4

의 사용 가능한 복제 [어떻게 직렬화하기 XML 문서] (https://stackoverflow.com/questions/364253/how-to-deserialize-xml-document) – stukselbax

답변

2

잘못된 유형의 역 직렬화를 호출하고 있습니다.

이렇게하면 XML에서 개체를 반환하는 serializer가 작성됩니다. 당신이 그렇게 할 수있는 시리얼을 분에게 testclass을 반환하려면

<?xml version="1.0" encoding="utf-16"?> 
<anyType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> 

:

var o = MySerializer.DeserializeObject<object>(xml); 

위의 라인처럼 자사의 XML 입력이 보일 것입니다 껍질하지 않은하려면

var tc = MySerializer.DeserializeObject<testclass>(xml); 

을 그 xml 입력을 사용하여 testclass 인스턴스를 제공합니다 (오류를 수정 한 경우)

+0

고맙습니다. 완벽하게 맞았습니다. 그러나 솔루션에 문제가 있습니다. 일반적으로 내가 역 직렬화 할 객체 유형을 미리 알지 못하기 때문입니다. deserialization 전에 객체 유형 이름을 저장하고 리플렉션을 사용하여 유형을 다시 가져와야합니다. 성가시다 ... –

+0

그래, 타입을 알아야하지만, 타입을 추측하기 위해 첫 번째 노드 이름에서 XML을 들여다 볼 수있다. 아직도 추측하지만 ... – rene

+0

그 유형 이름 만 될거야, 나는 여전히 유형을 얻기 위해 반사가 필요합니다. 그러나 이미이 방법으로 작업하고있는 문제는 없습니다 :-) –