2009-04-29 5 views

답변

2

첫 번째로, 실제로 필요한 것은 객체의 배열을 컨테이너에 저장하고 컨테이너를 직렬화하는 것입니다. 당신이 정말로 연결된 하나의 파일에 두 개의 직렬화 된 객체를 저장하려면

지금, :

나는이 "상자 밖으로"가능하다는 것을 확실하지 않다,하지만 당신은 두 가지를 할 수 있습니다.

  1. 사용하거나, 당신이 (# '오브젝트 파일의 내용을 설명하는 파일의 작은 시작에서 헤더 (또는 끝)를 쓸 것이다하는 자신의 반 tar 파일 형식을 발명 및 크기).

  2. 각 직렬화 된 개체의 시작과 끝을 직접 감지하는 C# 코드를 작성하십시오. 나는 그것이 가능하다는 것을 완전히 확신하지 못한다. Here은 직렬화 형식에 대한 공식 문서가 아닙니다. 여기에는 헤더가 포함되어 있지만이 헤더가 파일에 나타나지 않는다고 보장 할 수는 없습니다.

2

방법 컬렉션에 첫 번째 개체를 추가, 메모리의 개체에 첫 번째 파일의 내용 Deserialise이

에 대해 (예를 들어 목록 <YourObjectType>)의 다음 컬렉션을에는 직렬화, 그 컬렉션에 새 개체를 추가 (현재 두 개의 객체 포함)을 기존 파일의 맨 위에 추가합니다.

4

개체를 컬렉션 개체에 넣고 그런 식으로 직렬화하십시오. 기존 파일의 끝 부분에 객체의 이진 표현을 추가 할 수 있다면 다시 읽는 데 문제가 발생할 수 있습니다.

+0

내가 방금 말했던 것 같아. – tomfanning

+1

물론 동일합니다. 그러나 답변을 동시에 작성하고 다른 답변을 보지 않고도 거의 동시에 게시 할 수 있음을 상기하십시오. ;) – paweloque

+0

나는 이렇게 생각한다 :-) – tomfanning

3

실제로 스트림을 쓰기 위해 열어서 포인터를 스트림의 끝에 배치하면 다른 개체를 직렬화 할 수 있으며 기존 스트림에 추가됩니다.

역 직렬화는 개체를 지나치게 읽을 수도 있지만 더 이상 읽지는 않습니다.

분명히, 객체에 임의 접근을 원한다면 (객체 17을 역 직렬화하지만 앞에있는 모든 것을 역 직렬화하지 않음), 각 객체가 시작되는 위치의 색인이 필요하지만, 모든 객체 처음부터, 당신은 서로 후에 그들을 직렬화 할 수 있습니다.

+0

그리고 어떻게 애프터 워즈를 비 직렬화하겠습니까? 닷넷은 헤더로부터 직렬화 된 객체 크기를 알고 있습니까? –

+0

아주 좋은 질문입니다. 나는 그것을 매우 의심한다. –

+0

하지만 그렇습니다. –

19

실제로 가능합니다. 아래의 코드는 객체를 추가합니다.

using (var fileStream = new FileStream("C:\file.dat", FileMode.Append)) 
{ 
    var bFormatter = new BinaryFormatter(); 
    bFormatter.Serialize(fileStream, objectToSerialize); 
} 

다음 코드는 개체를 역 직렬화합니다.

var list = new List<ObjectToSerialize>();  

using (var fileStream = new FileStream("C:\file.dat", FileMode.Open)) 
{ 
    var bFormatter = new BinaryFormatter(); 
    while (fileStream.Position != fileStream.Length) 
    { 
     list.Add((ObjectToSerialize)bFormatter.Deserialize(fileStream)); 
    } 
} 

파일 작업에는 동일한 개체 만 포함되어야합니다.

+0

이 코드를 사용해 보셨습니까? 마지막으로 추가 된 부분 만 비 직렬화하는 것 같습니다. 여기 내 테스트 코드입니다 http://pastebin.com/EV4rPaT4 – mrgloom

+1

안녕하세요 mrgloom. 이것은 거의 4 살이지만 예, 문제없이 생산에 사용되었습니다. 테스트 코드를 살펴 보았습니다. 하나의 기존 목록에 추가되지 않는 3 개의 별도 목록을 직렬화합니다. deserialize 할 때 각 목록 객체를 최신 객체로 대체합니다. 22 행을 list.AddRange (목록 )로 변경해보십시오. bFormatter.Deserialize (fileStream)); 행운을 빕니다. – Magpie

+0

감사합니다. 훌륭한 작품입니다! 비록 내가 왜 그런지 모르겠다./bFormatter.Deserialize는 파일에서 ObjectToSerialize의 끝을 언제 알 수 있습니까? 디버깅하는 동안 fileStream.Position은 각 ObjectToSerialize가 끝나는 위치에서 멈추고 이유는 알 수 없습니다. – Loaderon

관련 문제