문제

나는 지난 주 직렬화 작업을하는 데 많은 시간을 보냈습니다. 그 기간 동안 나는 Binaryformatter 또는 xmlserializer를 사용하는 많은 예를 발견했습니다. 불행히도, 내가 찾지 못한 것은 두 가지의 차이점을 포괄적으로 자세히 설명하는 예입니다.

내 호기심의 기원은 XmlSerializer가 아닌 동안 Binaryformatter가 인터페이스로 직접 사막화 할 수있는 이유에 있습니다. 존 스키트 "에 대한 답으로"런타임에 여러 (알 수없는 유형)로 캐스팅"인터페이스에 직접 이진 직렬화의 예를 제공합니다. 스탠 R. 그의 대답에 XMLSerializer를 사용하여 내 목표를 달성하는 수단을 제공했습니다.XML 객체 인터페이스에 대한 실조 화."

XmlSerializer는 XML을 사용하는 반면 Binaryformatter의 명백한 외에도 이진 직렬화를 사용합니다. 하나 또는 다른 하나와 각각의 장단점을 사용하는시기.

도움이 되었습니까?

해결책

이진 포피 라트가 인터페이스 유형으로 직접화 할 수있는 이유는 객체가 원래 유형을 포함하는 이진 스트림 메타 데이터에 직렬화되고 어셈블리 정보가 객체 데이터와 함께 붙어 있기 때문입니다. 이는 이진 포피터가 객체를 분리 할 때 해당 유형을 알고 있고 올바른 객체를 빌드 한 다음 객체가 구현하는 인터페이스 유형에 시전 할 수 있음을 의미합니다.

다른 핸들의 XML 세리어 라이저는 스키마로 직렬화되며 객체의 공용 필드와 값 만 직렬화하며 다른 유형 정보가 없음 (예 : 유형 구현을 인터페이스).

여기에 좋은 게시물이 있습니다. .NET 직렬화, 비교 Binaryformatter, SOAPFormatter, 그리고 xmlserializer. 앞에서 언급 한 시리얼 라이저 외에 DataContractSerializer, NetDatacontractSerializer 그리고 protobuf-net.

Serialization Comparison

다른 팁

그냥 무게가 ...

둘 사이의 명백한 차이점은 "바이너리 대 XML"이지만 그보다 훨씬 더 깊습니다.

  • 필드 (BinaryFormatter= bf) vs 공공의 멤버 (일반적으로 속성) (XmlSerializer= xs)
  • Type-Metadata 기반 (BF) 대 계약 기반 (XS)
  • 버전 브리틀 (BF) 대 버전 내성 (XS)
  • "그래프"(bf) 대 "트리"(xs)
  • .NET 특정 (BF) 대 휴대용 (XS)
  • 불투명 (BF) 대 인간 읽을 수있는 (XS)

이유에 대한 토론으로 BinaryFormatter 부서지기 쉬울 수 있습니다. 여기를 봐.

어느 것이 더 큰지 논의하는 것은 불가능합니다. 모든 유형 메타 데이터가 BinaryFormatter 더 크게 만들 수 있습니다. 그리고 XmlSerializer GZIP와 같은 압축으로 매우 작동 할 수 있습니다.

그러나 각각의 강점을 취할 수 있습니다. 예를 들어 Google은 자체 데이터 직렬화 형식 인 "프로토콜 버퍼"를 개방했습니다. 이것은:

  • 계약 기반
  • 휴대용 (참조 구현 목록)
  • 버전에 관해
  • 나무 기반
  • opaque (.proto와 결합 할 때 데이터를 보여줄 도구가 있지만)
  • 일반적으로 "먼저 계약"그러나 일부 구현은 반성에 따라 암시 적 계약을 허용합니다.

그러나 중요한 것은 매우 밀도가 높은 데이터 (유형 메타 데이터 없음, 순수한 바이너리 표현, 짧은 태그, 변형 길이베이스 -7 인코딩과 같은 트릭) 및 처리하는 데 매우 효율적입니다 (복잡한 XML 구조 없음, 부재와 일치하는 문자열 등 ).

나는 약간 편견이있을 수 있습니다. 구현 중 하나를 유지 관리하지만 (C#/. Net에 적합한 몇 가지 포함) 어느 특정 구현; 형식은 그 자체의 장점하에 있습니다.-p

XML 시리얼 라이저는 XML과 XML 스키마 (암시 적으로)를 생성합니다. 이 스키마를 준수하는 XML을 생성합니다.

한 가지 의미는 XML 스키마에서 설명 할 수없는 것을 직렬화하지 않는다는 것입니다. 예를 들어, XML 스키마의 목록과 배열을 구별 할 방법이 없으므로 시리얼 라이저에서 생성 한 XML 스키마는 어느 쪽이든 해석 될 수 있습니다.

런타임 직렬화 ( BinaryFormatter ) 실제 .NET 유형을 다른쪽으로 직렬화하므로 List<int>, 다른 쪽은 a를 얻을 것입니다 List<int>.

상대방이 .NET을 실행하는 경우 분명히 더 잘 작동합니다.

XmlSerializer는 공개 getter와 공개 세터 (및 공개 분야)가있는 모든 유형의 속성을 읽음으로써 유형을 일련화합니다. 이런 의미에서 xmlserializer는 인스턴스의 "공개 견해"를 직렬화/사형화합니다.

대조적으로 바이너리 포맷터는 인스턴스의 "내부"를 직렬화하여 유형을 직렬화합니다. [Nonserialized]로 표시되지 않은 모든 필드는 이진 스트림에 직렬화됩니다. 유형 자체는 직렬화되어야하는 내부 필드와 마찬가지로 [시리얼 화 가능]로 표시되어야합니다.

가장 중요한 것 중 하나는 이진 직렬화가 공공 및 민간 회원을 직렬화 할 수있는 반면 다른 하나는 공공 회원과 만 작동한다는 것입니다.

여기에서는 크기 측면 에서이 두 가지 사이의 매우 유용한 비교를 제공합니다. 직렬화 된 객체를 원격 컴퓨터로 보낼 수 있기 때문에 매우 중요한 문제입니다.

http://www.nablasoft.com/alkampfer/index.php/2008/10/31/binary-versus-xml-serialization-size/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top