2013-06-15 3 views
0

스트림을 감시하는 파서 (아마도 NetworkStream)에서 작업하고 있습니다. 소스 스트림에 특정 데이터가 표시되면 새 MemoryStream이 작성되고 소스의 관련 데이터가 해당 데이터에 기록됩니다.BinaryReader의 BaseStream 위치를 변경하면 동일한 BaseStream을 사용하는 BinaryWriter의 현재 상태에 어떻게 영향을 줍니까?

그런 다음 MemoryStream을 구문 분석하는 다른 클래스 메서드로 구문 분석을 위해 MemoryStreamStream으로 전달합니다. 이 방법에서는 BinaryReader이 생성됩니다. 데이터를 읽으려고하면 BinaryReader이 실제로 데이터의 끝에 있기 때문에 아무 것도 없습니다.

BinaryReader에는 Position 속성이나 Seek 메서드가 없으므로 밑줄 BaseStream 위치를 변경해야합니다. 위치가 변경되면 스트림을 파싱 할 수 있습니다.

이 경우 추가 데이터가 추가되지 않으므로 아무런 문제가 없습니다. 그러나 유사한 상황이 발생하고 추가 데이터가이 데이터에 기록 될 경우 위치 값이 뒤에서 변경 되었기 때문에이 데이터가 작동하지 않을 수 있다는 생각이 들게됩니다.

나는 여기에 관한 함의에 조금 어색하다.

BaseStream 사본과 해당 위치 또는 원본 개체가 손상 될 수 있습니까?

두 작가가 같은 지점에서 시작한 다음 독자가 BaseStream 대신에 메서드를 전달할 수 있도록 작성기를 만드는 동시에 독자를 만들어야한다는 의미입니까? 나는 이것이 더 나은 실천이라고 생각한다.

BinaryReader와 Writer는 고유 한 위치 정보를 유지합니까? 나는 그 물건이 거기에 없기 때문에가 아닙니다. 그렇지 않다면 같은 스레드에서 동시에 사용할 수 있습니까?

업데이트 # 1 : 답변과 의견을 바탕으로 철회되었으므로 혼란을 좀 더 분명하게해야한다고 생각합니다. BinaryWriterBinaryReader 모두에 BaseStream 속성이 있습니다. 필자는 작가와 독자를 만드는 데 사용 된 스트림 객체를 지적했다고 생각했습니다. 나는 그것이 양쪽 모두에 고유 한 작업자 객체라고 생각하기 시작했습니다.

스트림 객체에 대해 많이 생각하고 싶지 않아 여러 유형의 스트림을 소스로 사용할 수 있습니다.

업데이트 # 2 : 이제 일부 테스트 코드를 실행 한 후 연결되어있는 것을 볼 수 있습니다. 데이터가 쓰여지면 리더의 위치에 영향을줍니다. 독자가 아무런 영향을받지 않고 그대로 두어 스트림의 다음 부분을 읽고 중단 한 부분을 찾아 낼 수 있다고 생각했습니다. 나는 다음과 같은 것을 상상했다 :

  • 데이터 이벤트가 발생한다. 이 이벤트는 데이터가 작성자에 의해 쓰여지도록합니다.
  • 어떤 시점에서 리더는 스트림의 일부 데이터에서 작동합니다.
  • 다른 이벤트가 발생하여 더 많은 데이터가 기록됩니다.
  • 독자가 이미 작업중인 데이터에 추가됩니다.
  • 독자가 새로운 데이터를 포함하여 작업을 마칩니다.

그러나 리더와 라이터간에 위치가 작동하는 방식에 따라 이것은 스트림이 사용되는 방식이 아닙니다.

내 BaseStream이 MemoryStream이고 규칙이 NetworkStream과 다를 수 있기 때문에 제 생각 상 문제 일 수 있습니다. 나는 읽기 클래스에서 스트림 소스의 구현 세부 사항을 유지하려고 시도했다.

나는이 시점에서 나는이 질문에 대한 답을 가지고 있다고 생각한다. 이제 스트림을 사용하여 내 머리 속에서하는 일의 유형에 대한 정보를 찾아야합니다.

답변

0

MemoryStream 작업시 Reader와 Writer가 기본 스트림의 위치를 ​​업데이트한다는 것을 알게되었습니다. 따라서 위치 값의 복사 및 복원을 저글링하지 않고도 여전히 기록중인 스트림을 읽을 수 없습니다. 권장하지 않습니다.

전체 트랜잭션을 MemoryStream에 기록하여 다른 클래스로 전달할 수 있도록 작업을 수정했습니다. 다음 트랜잭션을 위해 새 MemoryStream을 작성하십시오.

기본 스트림은 주어진 스트림의 파생물이 아니며 실제 스트림입니다.