2010-08-19 3 views
0

XML 문자열을 스트림에서 쓰고 읽은 후 직렬화 할 수 없게됩니다. 새 문자열이 잘립니다.Xml 직렬화/직렬화 해제 문제

string XmlContent = getContentFromMyDataBase(); 
XmlSerializer xs = new XmlSerializer(typeof(MyObj)); 
MemoryStream ms = new MemoryStream(); 
StreamWriter sw = new StreamWriter(ms); 
char[] ca = XmlContent.ToCharArray();  // still working up to this point. 
ms.Position = 0; 
sw.Write(ca); 
StreamReader sr = new StreamReader(ms); 
ms.Position = 0; 
string XmlContentAgain = sr.ReadToEnd(); 
Console.WriteLine(XmlContentAgain);  // (outputstring is too short.) 
MyObj theObj = (MyObj)xs.Deserialize(ms); // Can't deserialize. 

문제를 해결하는 방법이나 문제의 원인에 대한 제안 사항이 있으십니까? 내 유일한 추측은 어떤 형태의 인코딩 문제가 있지만 그것을 찾는 방법/고정하는 방법을 모르겠다.

또한 myObj에는 일반적으로 직렬화 할 수없는 일반 사전 구성원이 있으므로 직렬화하기 위해 Paul Welter의 코드를 도난당했습니다.

답변

2

시도 플러싱과 더 나은 폐기 또는 StringReader 사용하여 코드를 단순화 :

string xmlContent = getContentFromMyDataBase(); 
var xs = new XmlSerializer(typeof(MyObj)); 
using (var reader = new StringReader(xmlContent)) 
{ 
    var theObj = (MyObj)xs.Deserialize(reader); 
} 

참고하십시오 getContentFromMyDataBase 방법은 또한 당신의 데이터베이스에 XML을 저장하는 것을 제안 당신이 객체에 대해 역 직렬화하고 있음을 나타냅니다. 하지마.

+0

왜 XML을 데이터베이스에 저장하지 않습니까? – Mark

+0

SQL 데이터베이스는 관계형이기 때문에. XML은 계층 적입니다. 호환되지 않습니다. 데이터베이스는 데이터를 저장하기위한 것이지, 데이터의 표현 (XML)을 저장하기위한 것이 아닙니다. –

+3

XML은 텍스트입니다. 데이터베이스는 텍스트를 저장하는 데 아주 능숙합니다. XML을 데이터베이스에 저장하는 것이 전적으로 적합합니다. "데이터"와 "데이터 표현"사이의 구별은 임의적이고 의미가 없습니다. – Mark

0

StreamWriter를 플러시하거나 닫기 (암시 적으로 닫기)해야합니다. 그렇지 않으면 기본 스트림에 쓰기가 완료되었는지 확인할 수 없습니다. 이는 내부 버퍼링을 수행하고 있기 때문입니다.

이 시도 :

using(StreamWriter sw = new StreamWriter(ms)) 
{ 
    char[] ca = XmlContent.ToCharArray();  // still working up to this point. 
    ms.Position = 0; 
    sw.Write(ca); 
} 
StreamReader sr = new StreamReader(ms); 
ms.Position = 0; 
string XmlContentAgain = sr.ReadToEnd(); 
+0

이것은 작동하지 않습니다. 스트림은 사용 블록 다음에 액세스 할 수 없게됩니다. 코드를 바깥에서 안쪽으로 이동하면 이전과 동일한 문제가 발생합니다. – user420667

+0

StreamWriter를 삭제하면 기본 객체도 삭제되기 때문입니다. 스트림에서 버퍼를 가져올 수도 있고, 버퍼를 삭제하는 대신 작성자에게 Flush를 호출 할 수도 있습니다. – driis