2009-03-20 7 views
1

C#에서 사용자 지정 .NET serializer를 작성 중이며 XmlReader 및 XmlWriter를 사용하여 XML에 Array 개체를 읽고 쓰고 싶습니다. 배열을 base64로 인코딩하고 싶습니다. 배열은 1 차원, 2 차원 또는 3 차원 일 수 있으며 요소는 부울 또는 숫자 유형입니다.XML을 base64로 직렬화 할 수 있습니까?

나는 완전히 뒤죽박죽이다. XmlReader 및 XmlWriter에는 base64로 Byte [] 배열을 읽고 쓰는 메서드가 있지만 배열에서 Byte []까지 가져 오는 방법을 알 수는 없습니다.

배열이 커질 수 있으므로 한 번에 하나의 요소를 처리하거나 배열을 복사하지 않아도되는 솔루션을 선호합니다. 안전하지 않은 코드와 관리되는 또는 기본 C++이 좋습니다. XML에 안전하다면 base64 이외의 것을 사용할 수 있습니다.

도움이나 의견을 보내 주셔서 감사합니다.

답변

1

사용중인 '배열'종류에 따라 옵션이 달라집니다. 배열, 목록 <> 또는 ArrayList입니까?

목록의 경우 CopyTo()을 사용하여 목록의 일부를 가져와 이진 배열에 넣을 수 있습니다. 그러면이 배열을 XmlWriter로 쓸 수 있습니다. XmlReader에서 다시 읽으려면 InsertRange을 사용하여 데이터를 비 직렬화 할 수 있습니다.

독서 예 :

// elsewhere 
List<byte> bytes; 

// in the deserialization 
int bufferSize = 1024; 
byte[] buffer = new byte[bufferSize]; 
int index = 0; 
int numRead = -1; 

while (numRead != 0) // actually read stuff 
{ 
    numRead = reader.ReadContentAsBase64(buffer, bufferSize); 
    if (numRead > 0) 
    { 
     bytes.CopyTo(buffer, index, numRead); 
     index += numRead; 
    } 
} 

참고 : 위의 코드 테스트, 그러나 아마 가까운되지 않습니다. 비슷하지만 base64로 데이터를 인코딩하고 쓰는 것과 반대로 할 수 있습니다. 다른 유형의 경우 배열을 바이트 목록으로 변환하기 만하면됩니다.

바이트가 아닌 다른 형식을 바이트 배열로 가져 오려면 System.BitConverter을 사용해야합니다. 여기에는 기본 데이터 형식을 바이트 배열로 변환하는 GetBytesToInt32ToBoolean을 포함하는 ToXxx의 두 가지 방법이 있습니다. Base64 정보를 읽은 후 또는 작성하기 전에 해당 변환을 직접 담당해야합니다.

BitConverter를 사용하여 바이트 단위 변환을 수행 할 수 있지만 배열을 단일 바이트 배열로 변환하기위한 알고리즘을 설계하는 것은 사용자의 몫입니다.

+0

byte [] 또는 int [,]와 같은 System.Array입니다. "바이너리 배열"이란 무엇입니까? XmlWriter로 어떻게 작성합니까? –

+0

업데이트 된 예보기 :) –

+0

아, '숫자 또는 부울 유형'. 그런 다음 쓰기 전에 바이트 기반 배열로 변환해야합니다. –

0

Base-64 텍스트가 포함 된 단일 XML 요소로 표현되는 단일 배열이 필요한 경우 가장 쉬운 방법은 BinaryFormatter을 사용하여 데이터 (임의의 차원 수 List의 배열)를 바이트 배열로 변환 한 다음 base-64로 인코딩하고 XML 파일에 저장하십시오. 임의의 배열을 바이트 배열로 바꾸는 다른 쉬운 방법은 생각할 수 없습니다.

+0

그래, 그게 최선의 해결책이라고 생각해. 불행히도 배열을 BinaryFormatter 출력으로 복사해야합니다.이 출력은 피하고 싶습니다. –

0

내가 뭘했는지에 대한 간단한 요약 : 직렬화의 경우 BinaryWriter를 사용하여 개별 요소를 MemoryStream에 래핑 된 바이트 배열에 씁니다. 작은 덩어리로 쓰기를 해체하여 MemoryStream 배열이 작게 유지됩니다. 청크를 base64로 인코딩 된 텍스트 내용으로 개별 XML 요소로 작성하십시오.

역 직렬화는 거의 반대입니다. base64 청크는 바이트 배열로 디코드됩니다. 바이트 배열은 메모리 스트림에 의해 랩되고 BinaryReader에 의해 읽혀 요소를 결과 배열로 푸시합니다.

0

XmlSerializer를 사용하는 경우 byte [] 유형의 속성에서 "base64Binary"로 설정된 DataType 속성으로 XmlElementAttribute를 지정할 수 있습니다. here을 참조하십시오.

관련 문제