2013-06-16 2 views
1

글쎄, 이것은 기본적으로 일반적인 바이너리 라이터와 같습니다. 여러분은 객체가 있고 그것이 무엇인지 모릅니다. 나중에 검색 할 수 있도록 이진 데이터를 이진 파일에 어떻게 써야합니까? 내가 할 방법을 모르는알 수없는 유형의 객체를 이진 파일에 쓰는 방법은 무엇입니까?

내 원래 생각했다 : 어떻게 든 객체의

  1. 그림 밖으로 모든 구성원 구성원 유형으로하지 않는 한 (반사 아마도)
  2. BinaryWriter에 의해 쓰기 가능 구성원
  3. 에 1 단계를 반복
  4. 모든 핵심 레브 쓰기 헤더 일을 쓰기 회원의 유형을 명시 헤더를 확인하고 그들은 (어떻게 든) 객체로 조립하는 방법 엘 구성원

리플렉션을 사용하는 방법을 잘 모르기 때문에 대부분의 방법을 잘 모릅니다. 그러나 꽤 할 수 있어야합니다.

가능한 경우 어떻게해야합니까? 또는 위의 내용을 어떻게 구현해야합니까?

bin 

답변

1

가장 간단한 접근법은 BinaryFormatter을 사용하는 것입니다. 그러나 응용 프로그램의 이전 버전에서 저장 한 인스턴스를로드하려는 경우 클래스 변경에 매우주의해야합니다.

0

BinaryFormatter으로 가능할 수 있습니다. 그러나 모든 객체가 공통 객체를 참조하는 많은 객체가있는 객체 구조를 생각해보십시오. unknown 개체를 모두 직렬화하면 unknown 개체와 동일한 수의 개체로 끝납니다.

unknown 개체의 많은 필드가 생성자 또는 다른 클래스에 의해 설정되므로 관련이 없기 때문에 직렬화 될 때 일관성이없는 상태가 될 수 있습니다.

그래서 직렬화하기가 어려울 수도 있지만 어떻게 직렬화를 해제 하시겠습니까?

1

하드 어 스펙트는 오브젝트를 쓰지 않고 다시 읽습니다. .NET 프레임 워크는 프로세스를 자동화해야하는 클래스 유형의 직렬화 및 직렬화 해제에 대한 다양한 기술을 제공하지만 익숙한 모든 내장 기술에는 다양한 제한이 있습니다.

주요 문제는 .NET 만 불변를 식별하기위한 목적으로, 다른 코드에 의해 사용된다 개체 식별 목적하는 객체에 대한 참조를 보유하는 저장 위치 사이에 차이를 만든다 없다는 것이다 오브젝트 의 신원이이 아닌 오브젝트의 측면 또는 오브젝트 변경 가능 상태 캡슐화를 위해. 필드가 무엇을 나타내야하는지 알지 못하면 어떻게 serialize 또는 deserialize해야하는지 알 수 없습니다. 예를 들어, 특정 유형이 int[] 유형의 필드를 가지고 있다고 가정하면 값 23을 보유하는 단일 요소 배열에 대한 참조가 보관됩니다. 해당 필드의 목적은 값 23을 보유하는 것이거나, 그 필드의 목적은, 무엇인가가 발생할 때마다, 최초의 요소가 증가 할 필요가있는 배열을 식별하는 것입니다.전자의 시나리오에서 직렬화는 값 23을 포함하는 단일 요소 배열이라는 사실을 씁니다. 후자의 시나리오에서는 직렬화가 전혀 가능하지 않으면 배열의 중요성을 알아야합니다. 필드는 참조를 보유합니다.

다양한 사람들이 다양한 클래스를 자동으로 직렬화하기 위해 다양한 방법을 작성했지만, 나는 그러한 것들에 회의적 인 경향이 있습니다. 어떤 클래스의 필드가 사용되는지 알지 못하는 경우, 어떤 상태가 캡슐화되었는지에 대한 가정을 신중히해야합니다.

관련 문제