2010-01-12 3 views
7

채워진 DataTable이 있습니다. 나중에 사용할 수 있도록 파일로 serialize하려고합니다. 나는이 문제와 관련된 옵션을 살펴 봤는데 누군가가 올바른 방향으로 나를 가리킬 수 있는지 궁금해했다.나중에 재사용 할 수 있도록 데이터 테이블을 serialize

내가 만드는 것은 데이터 테이블을 파일에 쓰는 방법과 파일을 입력으로 사용하여 새 데이터 테이블을 만드는 방법입니다. WriteXML() 및 Load() 메서드를 사용하여이 작업을 수행하는 것이 합리적인지, 그렇다면 어떤 플래그가 작업에 집중할 수 있습니까? 지도 해줘서 고마워.

도움이되는 경우 .Net 2.0을 사용하고 있습니다.

답변

10

나는 read/write xml 메서드를 사용할 것이다. 우리는 꽤 광범위하게 사용합니다. 빠르고 간단하며 프레임 워크에 내장되어 있습니다.

+10

난 당신이 코드 샘플을 포함하는 경우이 대답은 훨씬 더 좋을 것이다 생각합니다. 읽기/쓰기 XML 방법을 사용하는 방법을 알고 있으므로 질문 작성자가 될 수도 있지만이 사이트는 우리 자신의 질문에 대한 답을 얻는 것 이상의 의미를가집니다. 문제가 발생한 다른 사람들을 위해 문서화하는 것입니다. 이 질문에 도달 한 다른 사용자는 방법을 사용하는 방법을 모를 수도 있습니다. –

1

데이터베이스를 헤더가있는 CSV 파일로 직렬화하는 기본 기술을 사용할 수 있습니다. 일부 데이터베이스 관리 시스템은 이러한 파일에서 쉽게 데이터로드를 지원합니다. 그리고 dbms가 그렇지 않은 경우에는 이것을 수행 할 코드를 작성하는 것이 그리 어렵지 않을 것입니다. 그 질문에 대답합니까?

xml의 단점은 실제 데이터보다 메타 데이터가 더 많이 포함되어 있다는 것입니다. csv 파일의 경우 메타 데이터가 반복되지 않습니다.

0

데이터 테이블이 메모리에있는 개체입니까? 그렇다면 간단히 직렬화 및 직렬화 해제 방법을 사용할 수 있습니다. 그들은 상대적으로 신속하게 원하는 결과를 유지할 수 있습니다.

+0

어떤'Serialize'와'Deserialize' 메소드를 참조하고 있습니까? –

+0

System.Xml.Serialization.XmlSerializer 클래스 내의 메서드를 사용할 수 있습니다. 나는 지금 고객이되었지만 시간이 좀 있으면 내가 갖고있는 예를 찾으려고 노력할 것이다. 그들은 사용하기가 아주 쉽습니다. –

+0

안녕하세요, 예, DataTable이 메모리에 있습니다. ReadXml()과 WriteXml()을 사용하고있어 코드 스 니펫 (snippet)을 보는 데 관심이 있습니다. 감사! – larryq

13

나는 Silveira comment 이진 직렬화의 평균 사용이라고 생각합니다. 그리고 직렬화가 대용량 데이터의 경우 바이너리와 비교할 때 매우 느린 XML과 비교할 때 매우 빠릅니다. 또한 XML과 비교할 때 디스크 공간이 훨씬 적습니다.

public static void Serialize(DataSet ds, Stream stream) { 
     BinaryFormatter serializer = new BinaryFormatter(); 
     serializer.Serialize(stream, ds); 
    } 

    public static DataSet Deserialize(Stream stream) { 
     BinaryFormatter serializer = new BinaryFormatter(); 
     return (DataSet)serializer.Deserialize(stream); 
    } 
+0

바이너리 직렬화를 사용할 때의 단점 중 하나는 바이너리 직렬화에 어셈블리의 정규화 된 형식 이름이 직렬화되어 있으므로 System.Data.dll이 변경되면 이진 파일에서 데이터를 읽을 수 없게됩니다. 그러나 DataSet과 네임 스페이스의 다른 클래스는 프레임 워크의 일부이므로 변경할 필요가 없으므로이 경우 아무런 문제가 없습니다. – affan

+0

저는 대개 소량의 데이터를 직렬화하기 만 했으므로 XMLSerializer는 문제가 없습니다. 그러나 여기에서 중요한 점은 직렬화가 좋은 방법임을 우리 모두가 동의하는 것입니다. 올바른 포맷터 (XML, Binary, DataContract)는 다른 요구 사항에 따라 선택할 수 있습니다 (예 : 앱 내에서 데이터를 읽고 다른 환경으로 내보낼 필요가없는 경우 이진 파일이 완벽한 선택 임) . –

+0

팁을 주셔서 감사합니다. Affan – larryq

7

중요 POINT :
당신이 DataTable 개체 또는 이진 포맷터를 사용하여 DataSet 객체를 직렬화하려고하면, 당신은 여전히 ​​이진 파일을 얻을 것이다, 그러나 그것이 가득 있기 때문에 상당히 큰 하나 톤의 XML 데이터 불행히도 바이너리 파일의 XML 데이터는 XML이 제공하는 이식성과 가독성이없는 거대한 파일을 만듭니다. 결과적으로 이러한 파일을 deserialize하는 것은 완료하는 데 몇 초가 걸리고 실제로 필요한 것보다 훨씬 많은 메모리를 차지하게됩니다. 결과적으로보다 컴팩트 한 출력을 필요로하기 때문에 ADO.NET 객체의 바이너리 직렬화를 선택하면 으로 실패합니다. 이진 직렬화는 여전히 가장 공간 효율적인 방식이지만 ADO.NET 개체를 사용할 경우 효과적이지는 않습니다. 전체 참고로

은 다음 문서를 참조 : -
http://msdn.microsoft.com/en-us/magazine/cc188907.aspx

+0

그것은 좋은 말인데 실제로 질문에 대한 답변이 아니며 + 링크가 작동하지 않습니다. – Szybki

관련 문제