2011-02-05 3 views
2

인사말,사용자 지정 바이너리 파일의 관용 C# 직렬화?

이진 사용자 지정 형식의 serialization/deserialization을 수행하는 가장 관용적 인 방법은 무엇입니까? 예를 들어 패딩없이 바이트 수 (예 : 4, 4, 16, 4, 8, 4, 16)로 지정된 머리글 집합이있는 파일을 혼합 정수/byte[] 형식으로 읽는 방법은 무엇입니까?

즉, 스트림을 통해 Read/WriteBytes 시퀀스를 사용하지 않고도 구조를 지정할 때 C와 동일한 수준의 제어를 달성하려면 어떻게해야합니까?

감사합니다.

+0

왜 필요하겠습니까? 내장 된 [이진 직렬화 기능] (http://msdn.microsoft.com/en-us/library/72hyey7b.aspx)의 문제점은 무엇입니까? –

+2

형식을 제어하지 않으면 @Cody는 쓸모가 없습니다. –

+0

@Marc : 네, 맞습니다. 그것이 사실인지 질문하는 것이 내게 명확하지 않았습니다. 그것이 옵션이라면, 그것은 가장 우아한 것입니다. .NET Framework를 처음 접하는 많은 프로그래머는 내장 된 이러한 유형의 기능을 인식하지 못합니다. –

답변

1

여기에는 article이 있습니다. 하지만 ideomatic .NET을 원한다면 BinaryReader을 사용하십시오. 형식이 부과되지 않고 해당 형식을 제어 할 수있는 경우 BinaryFormatter을 사용할 수도 있지만이 형식이 생성하는 것은 상호 운용 할 수 없습니다.

+0

개인적으로이 시나리오에서는 BinaryReader를 전혀 사용하지 않습니다. 그냥 원시 스트림. 당신은 BinaryReader가 int, string 등을 위해 사용하고자하는 prw 정의 포맷을 처리해야한다. 꽤 쓸모 없게된다. –

+0

@Marc, 스트림에서 직접 미가공 바이트를 읽고 기본 .NET 데이터 형식으로 변환하는 것이 좋습니다. –

+0

글쎄, 필드 당 레벨 (내 답변에 포함 된대로)에서 확실합니다. 원시 읽기를 줄이기 위해 중간에 버퍼가있는 비트. –

0

사용자 지정 형식이라고 가정하면 XmlReader API를 살펴볼 것입니다. 스트림을 타고있는 SomeFormatReader를 작성하고 다음 헤더를 읽는 메소드가 있습니다. 호출자가이 반환을 true로 보았 으면 (호출자가 EOF를 의미하는) 호출자는 다음 데이터 형식을 확인하는 속성에 액세스 할 수 있어야하며 ReadInt32, ReadString, ReadSingle 등을 호출하여 각 바이너리 형식의 규칙). 내 경우에는 내 독자 클래스도 추가 데이터 버퍼링을 처리합니다.

그런 다음 형식 메타 데이터와 새로 작성된 판독기를 사용하여 보조 모델을 래핑하여 개체 모델 (리플렉션, 코드 생성, 메타 프로그래밍 등). 그러나 좋은 독창적 인 독자를 만드는 것은 그가 처음 장애물입니다.

+0

아마 가장 구현하기 쉬운 방법 일 것입니다. 하지만 ... 아마 instomatic (instrospection과 custom-attributes 마법 같은)일지도 모릅니다. –

+0

@Hugo - wrapper 레이어'SomeFormatSerializer'를 호출하고, 새로운 하나의 deserialize를 호출합니다. - 제가 아는 모든 .NET serializer처럼 느껴집니다 ... –

관련 문제