2009-08-23 7 views
0

왜 우리는 랜덤 액세스 파일에 객체를 직렬화 할 수 없습니까? 그리고 다른 한편으로 순차적 접근 파일로 객체를 직렬화 할 수 있습니까?왜 이러한 개체를 일련화할 수 없습니까?

""C#은 런타임에 개체의 크기를 가져 오는 수단을 제공하지 않습니다. 즉, 우리가 클래스를 serialize하는 경우 을 의미합니다. 고정 길이 레코드 크기 ""(내가 읽은 책에서)를 보장 할 수 없습니다.

그래서 우리는 파일의 모든 객체 크기를 모르기 때문에 랜덤 액세스 파일을 읽을 수 없으므로 우리는 어떻게 찾을 수 있습니까 ??????

+3

"임의 액세스 파일"이란 무엇입니까? 'System.Stream'에서 상속받은 클래스로 객체를 직렬화 할 수 있습니다. –

+0

작동하지 않는 예제 코드를 포함시켜 주시겠습니까? – Richard

+0

질문을 편집 한 후 확인하십시오. – Sherif

답변

2

SerializableAttribute 속성으로 표시된 모든 객체는 (대부분의 시나리오에서) 직렬화 할 수 있습니다. 직렬화의 결과는 항상 스트림으로 보내지며 스트림은 파일 출력 스트림이 될 수 있습니다.

개체 그래프를 부분적으로 직렬화 할 수없는 이유는 무엇입니까? .NET 직렬화 만 [de] 전체 객체 그래프를 직렬화합니다. 그렇지 않으면 다른 직렬화 포맷터를 사용하거나 직접 작성해야합니다.

파일에 직접 임의 액세스하려면 검색을 지원하는 스트림으로 파일을 열어야합니다.

편집 : 직렬화의 결과 스트림에서 찾는

은 실제적인 목적이 없습니다 - 단지 serialiation 포맷터 어쨌든 거기에있어 항상 스트림의 매우 시작을 공급되어야 하는지를 알고있다.

다른 구조에 데이터를 지속시키기 위해; 두 단계로 처리하십시오. 먼저 직렬화 바이트를 [ memory-backed] 스트림을 사용하여 나중에 크기를 읽을 수 있고, 그런 다음 크기에 대한 지식을 사용하여 실제 백업 저장소에 데이터를 쓸 수 있습니다.

직렬화 된 표현이 런타임 표현과 많이 다를 수 있기 때문에 직렬화 된 객체의 크기를 예측할 수 없습니다.

기본 유형 만 사용하고 BinaryWriter를 사용하여 작성한 경우 출력 크기에 대한 정확한 제어가 가능하지만 이는 직렬화가 아닙니다.

+0

""C#은 런타임에 객체의 크기를 가져 오는 수단을 제공하지 않습니다. 즉, 클래스를 직렬화하면 고정 길이 레코드 크기를 보장 할 수 없다는 것을 의미합니다 ("책"에서 읽음). 그래서 우리는 파일의 모든 객체 크기를 모르기 때문에 랜덤 액세스 파일을 읽을 수 없으므로 우리는 어떻게 찾을 수 있습니까 ?????? – Sherif

+0

기록 된 바이트 수를 해독 할 수있는 스트림으로 항상 직렬화 할 수 있습니다. MemoryStream은 이것에 대한 좋은 후보입니다. 그 후 데이터는 길이가 다른 접두어 또는 색인 된 다른 방법으로 유지 될 수 있습니다. –

0

.NET의 기본 이진 serialization은 전체 개체 그래프를 serialize합니다. 그래프가되는 특성 상 일정한 크기가 없기 때문에 각 serialization 개체 (레코드)의 크기가 일정하지 않습니다. , 임의 액세스를 방지합니다.

파일의 임의의 레코드에 임의로 액세스하려면 클래스의 이진 직렬화 구현을 직접 작성하거나 데이터베이스를 사용하십시오. 단순한, 설치하지 않는 단일 스레드 데이터베이스 엔진이 필요하면 SQL Server Compact을보십시오.

+0

그래프의 직렬화 된 상태의 크기는 매우 일정합니다;) –

+0

참이지만 질문이나 대답과 관련이 없습니다. 전체 객체 그래프는 런타임에 직렬화해야하므로 컴파일 타임에 객체의 직렬화 된 크기를 예측할 수 없습니다. 런타임에 그래프의 크기는 보장 할 수 없습니다. –

관련 문제