2014-06-18 2 views
3

큰 XML 문서를 SQL Server에 이진 형식으로 저장하는 시스템을 인수했습니다.XDocument를 바이트 배열 (및 바이트 배열을 XDocument로 변환)

현재 데이터를 문자열로 변환 한 다음 해당 문자열을 바이트 배열로 변환하여 데이터를 저장합니다. 그러나 최근에 일부 대형 XML 문서에서 문자열로 변환하려고 할 때 메모리 예외가 발생하므로이 프로세스를 건너 뛰고 XDocument에서 바이트 배열로 바로 이동하려고합니다.

XML을 잡고

엔터티 프레임 워크 클래스는 바이너리 데이터가이 같은 문자열로 액세스 할 수 있도록 확장되었습니다 :

: 나는 더 이런 식으로 뭔가를 찾기 위해 클래스를 확장 할

partial class XmlData 
{ 
    public string XmlString { get { return Encoding.UTF8.GetString(XmlBinary); } set { XmlBinary = Encoding.UTF8.GetBytes(value); } } 
} 

partial class XmlData 
{ 
    public string XmlString{ get { return Encoding.UTF8.GetString(XmlBinary); } set { XmlBinary = Encoding.UTF8.GetBytes(value); } } 

    public XDocument XDoc 
    { 
     get 
     { 
      // Convert XmlBinary to XDocument 
     } 
     set 
     { 
      // Convert XDocument to XmlBinary 
     } 
    } 
} 

변환을 거의 알아 냈다고 생각하지만 부분 클래스 XmlString 메서드를 사용하여 DB에서 XML을 다시 가져올 때 XML은 끝 부분에서 항상 다른 문자 수로 항상 잘라냅니다. :

var memoryStream = new MemoryStream(); 
var xmlWriter = XmlWriter.Create(memoryStream); 
myXDocument.WriteTo(xmlWriter); 
XmlData.XmlBinary = memoryStream.ToArray(); 

솔루션

여기에 기본 변환입니다 :

var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Encoding = Encoding.UTF8 }; 
using (var memoryStream = new MemoryStream()) 
using (var xmlWriter = XmlWriter.Create(memoryStream, settings)) 
{ 
    myXDocument.WriteTo(xmlWriter); 
    xmlWriter.Flush(); 
    XmlData.XmlBinary = memoryStream.ToArray(); 
} 

는 그러나이 과정에서 어떤 이유로, 어떤 이상한 비 ASCII 문자가 그래서 그로드 것입니다 내 이전 xmlString을 방법을 사용하여 XML에 추가됩니다 이상한 문자 XDocument.Parse() 나의 새로운 부분 클래스는 다음과 같습니다 있도록 휴식 것이 :

partial class XmlData 
{ 
    public string XmlString 
    { 
     get 
     { 
      var xml = Encoding.UTF8.GetString(XmlBinary); 
      xml = Regex.Replace(xml, @"[^\u0000-\u007F]", string.Empty); // Removes non ascii characters 
      return xml; 
     } 
     set 
     { 
      value = Regex.Replace(value, @"[^\u0000-\u007F]", string.Empty); // Removes non ascii characters 
      XmlBinary = Encoding.UTF8.GetBytes(value); 
     } 
    } 

    public XDocument XDoc 
    { 
     get 
     { 
      using (var memoryStream = new MemoryStream(XmlBinary)) 
      using (var xmlReader = XmlReader.Create(memoryStream)) 
      { 
       var xml = XDocument.Load(xmlReader); 
       return xml; 
      } 
     } 
     set 
     { 
      var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Encoding = Encoding.UTF8 }; 
      using (var memoryStream = new MemoryStream()) 
      using (var xmlWriter = XmlWriter.Create(memoryStream, settings)) 
      { 
       value.WriteTo(xmlWriter); 
       xmlWriter.Flush(); 
       XmlBinary = memoryStream.ToArray(); 
      } 
     } 
    } 
} 
+2

소리가납니다. 스트림/라이터 중 하나의 버퍼가 읽기 또는 쓰기 중에 플러시되지 않았습니다. -''(...) '를 사용하여 autoclose, flush 및 dispose를하고, 또한 읽기/쓰기를 마친 모든 장소에서' .Flush()' – Lanorkin

+0

그게 다야! 가서 답을 추가하면 받아 들일 것입니다. – Owen

답변

2

T 읽기/쓰기 중 하나의 버퍼와 같은 소리가 들리지 않음 - 자동 클럭, 플러시 및 삭제를 위해 using (...)을 사용하고 완료 한 모든 장소에서 확인하십시오. .Flush()

관련 문제