2013-03-07 2 views
2

.NET 프레임 워크는 메서드 호출이 스트림을 반환하고 필요한대로 읽고 구현할 수있는 예제로 가득합니다. 그러나이 방법으로 어떻게 작동합니까? 그 물줄기는 무엇입니까?Stream을 반환하는 메서드는 어떻게 구현됩니까?

일부 입력을 받아 일부 데이터를 미리 정의 된 형식으로 구문 분석하는 파서를 작성 중입니다. 예를 들어 내가 MemoryStream을 만든 다음 StreamWriter를 사용하여 내용을 작성한 다음 메서드에서 스트림을 반환하게하는 경우 작성자가 완료되면 스트림을 닫고 호출자가 스트림을 처리 할 수 ​​없으므로 문제가 발생합니다 예상대로 읽으십시오.

일반적으로 어떻게 관리됩니까? 필요한 경우 (예 : byte[]) 객체에 저장된 스트림의 내용이며 스트림을 요청하는 메서드가 호출 될 때 해당 시간에 스트림을 만들거나 무엇을할까요?

+2

당신이 언급하는 어떤 마술 링크의 도움 아래 생각? 'Stream GetAStream() {return new MemoryStream();}'이 작동합니다. –

답변

5

스트림은 파일, 입출력 장치, 프로세스 간 통신 파이프 또는 TCP/IP 소켓과 같은 일련의 바이트를 추상화 한 것입니다. Stream 클래스와 파생 클래스는 프로그래머가 운영 체제 및 기본 장치의 세부 정보에서 분리되어 이러한 다양한 유형의 입출력에 대한 일반적인보기를 제공합니다.

그래서 내가

직렬화가 지속성 저장 바이트에서 개체를 변환하는 과정을 말합니다 당신이 스트림을 사용하여 .NET에서 다른 형식을 사용하여 직렬화, 직렬화 사용하여 가정 귀하의 요구를 정의 할 필요가 [MSDN 말했다] . deserialization 프로세스는 데이터를 손실하지 않고 바이트를 객체로 변환합니다. 직렬화는 파일 또는 데이터베이스에 값을 저장하고 네트워크를 통해 객체를 보내고 원래의 객체 형식으로 다시 변환하는 데 사용됩니다. .NET Framework는 직렬화 프로세스를 쉽게하기위한 프레임 워크 클래스 라이브러리 (FCL) 세트를 제공합니다. 두 개의 다른 응용 프로그램간에 데이터를 전송하는 데 매우 유용합니다.

.NET Framework는 이진 serialization 및 XML serialization 형식을 지원합니다. XML 직렬화는 공용 필드 만 직렬화합니다. 그러나 이진 직렬화는 모든 개인 및 공용 필드를 직렬화합니다. 직렬화는 기본 또는 사용자 정의로 수행 될 수 있습니다. 기본 직렬화는 클래스에 SerializableAttribute 특성이 적용될 때 발생합니다. 기본 직렬화는 버전 관리를 지원하지 않습니다. 커스텀 직렬화 클래스는 SerializableAttribute로 표시해, ISerializable 인터페이스를 구현할 필요가 있습니다.사용자는 Binary 및 XML serialization 형식 모두에 대해 사용자 지정 serialization을 구현할 수 있습니다. GetObjectData는 사용자 지정 응용 프로그램에 대해 재정의해야합니다. 샘플 응용 프로그램은 이진 및 XML 직렬화에 대해 사용자 지정 serialization을 사용합니다. .NET Framework는 개발 도구와 관련된 디자이너 직렬화를 지원합니다. 사용자 지정 serialization

사용자 지정 serialization은 serialization 및 deserialization 프로세스를 제어하는 ​​프로세스입니다. 사용자 지정 직렬화는 직렬화 중 또는 이후에 사용자 지정 메서드를 실행하거나 ISerializable 인터페이스를 구현하여 구현할 수 있습니다. 사용자 지정 serialization은 serialization 개체의 버전을 지정하는 데 사용됩니다. 직렬화 된 객체가 객체 상태를 변경 한 경우 (이후 버전에서 새 파일 추가) 사용자 정의 직렬화는 데이터 손실없이 값을 가져 오는 데 사용됩니다. 직렬화 된 객체의 버전은 속성 누락으로 인해 실패 할 수 있습니다.

사용자가 serialization 도중 및 이후에 사용자 지정 메서드를 사용하려면 직렬화 및 비 직렬화 중에 데이터를 사용자 지정하기 위해 OnDeserializedAttribute, OnDeserializingAttribute, OnSerializedAttribute 및 OnSerializingAttribute 특성을 사용하여 사용자 지정 serialization 지원을 적용해야합니다. OptionalFieldAttribute 특성은 deserialization을 위해 이전 버전 데이터를 무시하는 데 사용됩니다. 포맷터는 직렬화 복원 중에 오류를주지 않습니다. 그것은 serialization/deserialization 전후에 객체를 업데이트 할 수 있습니다.

난 당신이
http://www.codeproject.com/Articles/422474/Serialization-using-different-formats-in-NET

2

스트림은 여러 가지로 백업 할 수 있습니다. 이것이 추상적 인 기본 클래스 Stream에서 파생 된 스트림의 전체 아이디어입니다.

스트림은 OS 레벨 파일 스트림, 메모리, HTTP 연결 또는 Stream 계약을 수행 할 수있는 기타 항목으로 백업 할 수 있습니다.

MemoryStream의 경우 백업 저장소는 메모리 블록에 불과합니다.

StreamWriter의 경우 Dispose()를 호출하면 기본 스트림이 닫힙니다. 여전히 스트림을 사용하려는 경우 작성자를 삭제하지 마십시오. 당신이 다시 액세스 할 수있는 MemoryStream을 그것에 작성 후 원하는 경우 또한, 확인하고 처음에 위치, 예를 설정합니다

memStream.Seek(0, SeekOrigin.Begin); 
+0

IStream은 COM 인터페이스 유형입니다. MemoryStream 또는 FileStream을 처리 할 수 ​​없습니다. –

+0

@MatthewWatson : Do'h. 내 대답이 업데이트되었습니다. –

1

StreamWriter를 가지고 당신이 쓰기에하지 지시하는 데 사용할 수있는 오버로드 된 생성자 스트림을 닫습니다.

또한 StreamWriterWither를 피할 수있는 .WriteBytes 메서드가 있어야합니다.

관련 문제