2010-07-15 2 views
5

다음과 같은 문제가 있습니다. 디스크의 단일 파일에 객체 스트림을 직렬화 (바이너리)해야합니다. 직렬화 부분은 문제가되지 않습니다. 추가 모드에서 스트림을 열고 .Net의 BinaryFormatter Serialize 메서드를 사용하면 작업이 완료됩니다. 이 접근 방식의 문제점은이 스트림을 BinaryFormatter의 deserialize 함수에 제공 할 수 없다는 것입니다.이 함수에는 직렬화 한 객체의 단일 인스턴스가 들어 있지 않습니다.이진수 (De) 1 파일에 객체 스트림 직렬화

이 문제에 대한 일반적인 해결책이 있습니까? 주어진 스트림에 직렬화 된 모든 객체는 같은 유형이므로 적어도 비 직렬화되어야 할 것이 무엇인지 파악할 필요가 없습니다. 이는 주어진 것입니다. 그러나이 방법은 나에게이 방법을 제안하지 않는 것 같습니다.

응답에 따라 명확한 설명 : 클 것으로 예상된다 전송 객체의 수와는 메모리에 모두로드 할 필요 디스크에 플러시로 (래퍼 컬렉션 그들 모두를 유지하는 것이 불가능하다 -> 새로 추가 -> 디스크로 플러시). 당신은 하나의 객체를 직렬화 할 때

  • 은 일반적으로 당신이 포함 된 파일을 얻을 :

내가 만드는 오전 것이 들어있는 파일입니다

  • [오브젝트] :

[개체] [개체] [개체] [개체] ... [개체]

그리고 개별 Object 인스턴스를 deserialize해야합니다.

미리 감사드립니다.

답변 :

while (fileStream.Position < fileStream.Length) 
    messages.Add((Message)formatter.Deserialize(fileStream)); 

경우 BinaryFormatter는 하나 개의 객체를 직렬화합니다 : 대답은 (충분한 명확성)이 스레드에서 언급하지만, 명시 적으로 언급되지 않습니다 때문에, 나는 내가 여기 상태 것이다 생각 한 번에 원하는대로 :) fileStream.Length 속성을 캐싱 할 수 있습니다. 속성을 호출 할 때마다 길이가 다시 계산되어 나타나면 작업 속도가 느려지는 것 같습니다. 나는이 질문을 게시하기 전에 시도한 것이 처음에는 작동하지 않는 이유를 모르지만 지금은 완벽하게 작동합니다.

답변

1

는, (나는 목록이 직렬화 생각) 직렬화 모음으로 개체를 넣어 (드) 설명에 대한 응답으로 객체

그 EDIT를 직렬화보십시오 : 난 그냥이 질문에 같은 대답을 가지고 실현 이 question. 시도하고 대답을 재발견하는 대신, 난 그냥 마크 Gravell의 답변을 살펴보고, 또는 this one

+0

오브젝트는 시스템의 수명 기간 동안 스트리밍되며, 매우 많은 수의 오브젝트가 예상된다 , 나는 내릴 필요가있다.래퍼 컬렉션에 보관하면 디스크에 플러시 할 때마다 메모리에 전체 파일을 저장하고 전체 파일을 다시 써야합니다. – United

+0

첫 번째 제안은 다른 도서관 (일명 6 개월 + 합법적 인 승인 절차)이 필요하다는 이유로 계정에서 작동하지 않습니다. 두 번째 것은 흥미 롭습니다. 두 번째 대답은 콜렉션에있는 객체없이 한 파일에서 일련의 객체를 직렬화 해제하기 위해 정상적인 직렬화가 수행 된 것으로 보입니다. 내 테스트에서는 작동하지 않았고, 그래서 나는 더 깊이 조사하려고 노력할 것입니다. 아마도 그 질문에서 후속 조치를 취할 것입니다. – United

0

가 직렬화 인 파일, 그래서 나는 당신이 무엇을 할 것 파일에 직접 스트림을 전송 생각 것 원하는 것처럼 보입니다. 귀하의 상황에 대한보다 구체적인 설명이 도움이 될 것입니다. (나는 이것을 '코멘트'로 입력 할 수 있었으면 좋겠지 만, 어떻게 든 코멘트 버튼을 사용할 수 없다.)

+0

직렬화가 문제되지 않습니다. 문제는 내가 한 번에 하나의 개체를 직렬화하여 하나의 스트림에 추가하면 전체 스트림이 단일 개체를 나타내지 않으므로 결과 스트림을 deserialize 할 수 없다는 것입니다. – United

+0

기본적으로 일반적으로 객체를 파일로 직렬화하면 파일에 해당 객체 (예 : [Object])가 포함되어 있으므로 비 직렬화 할 수 있습니다. Object obj = binaryFormatter.Deserialize (fs, MyObjType); 내가 가지고있는 것은 [Object] [Object] ... [Object] 형식의 파일이다. 그래서 나는 deserializer를 제공 한 것이 단일 객체의 직렬화가 아니기 때문에이 파일에 대해 deserialize 함수를 호출 할 수 없다. – United

+0

내가 생각한 것은 (serializer가 결코 생성 할 수없는 기호의 조합이 존재할 경우) 일부 구분 기호를 넣는 것입니다. 그런 식으로 하나의 스트림에서 파일을 청크 (단일 직렬화 된 객체를 나타냄)로 수동으로 구문 분석하고 청크를 다른 스트림에 제공 할 수 있으며 차례로 디시리얼라이저에 제공됩니다. – United