문제

인터페이스가없는 클래스를 직렬화 할 수있는 것처럼 보이므로 그 목적이 확실하지 않습니다.

도움이 되었습니까?

해결책

ISerializable 일반적으로 사용자 정의 이진 직렬화를 제공하는 데 사용됩니다. BinaryFormatter (아마도 원격 목적으로). 그것 없이는 필드를 사용합니다.

  • 무능한; 런타임시 효율에만 사용되지만 직렬화를 위해 제거 할 수있는 필드가있는 경우 (예 : 직렬화 될 때 사전이 다르게 보일 수 있음)
  • 무능한; 필요한 필드의 경우에도 많은 추가 메타 데이터를 포함해야합니다.
  • 유효하지 않은; 필드가 있다면 할 수 없습니다 직렬화 (예 : 이벤트 대의원 등). [NonSerialized])
  • 다루기 힘든; 당신의 직렬화는 이제 필드 이름 - 그러나 필드는 구현 세부 사항입니다. 또한보십시오 난독 화, 직렬화 및 자동으로 구현 된 속성

구현하여 ISerializable 자신의 이진 직렬화 메커니즘을 제공 할 수 있습니다. 이것과 동일합니다 IXmlSerializable, 사용 된대로 XmlSerializer 등.

DTO 목적을 위해 BinaryFormatter 피해야합니다 - XML과 같은 것들 (비아 XmlSerializer 또는 DataContractSerializer) 또는 JSON은 프로토콜 버퍼와 같은 크로스 플랫폼 형식과 마찬가지로 양호합니다.

완전성을 위해 Protobuf-Net에는 후크가 포함되어 있습니다 ISerializable (많은 코드를 쓰지 않고 휴대용 바이너리 형식을 사용할 수 있지만) BinaryFormatter 어쨌든 여기서 첫 번째 선택이 아닐 것입니다.

다른 팁

클래스는 .NET에서 두 가지 방법 중 하나로 직렬화 될 수 있습니다.

  1. 수업을 표시합니다 SerializableAttribute 그리고 당신의 모든 들판을 장식합니다 ~하지 않다 The와 직렬화되기를 원합니다 NonSerialized 기인하다. (Marc Gravell이 지적했듯이 BinaryFormatter, 이것은 일반적으로 형식에 사용되는 클래스입니다 ISerializable 객체는 구체적으로 달리 표시되지 않는 한 모든 필드를 자동으로 직렬화합니다.)
  2. 구현 ISerializable 완전히 사용자 정의 직렬화를위한 인터페이스.

전자는 단순히 속성으로 선언을 표시하는 것이 포함되어 있기 때문에 사용하기가 더 간단하지만 그 힘은 제한적입니다. 후자는 더 많은 유연성을 허용하지만 구현하려면 훨씬 더 많은 노력이 필요합니다. 사용해야하는 것은 컨텍스트에 완전히 따라 다릅니다.

후자 (ISerializable) 그리고 IT 사용, 나는 인용했다 MSDN 페이지 인터페이스 :

직렬화 될 수있는 클래스에는 SerializableAttribute가 표시되어야합니다. 클래스가 직렬화 프로세스를 제어 해야하는 경우 iserializable 인터페이스를 구현할 수 있습니다. Formatter는 직렬화 시간에 GetObjectData를 호출하고 객체를 나타내는 데 필요한 모든 데이터로 제공된 직렬화 인포를 채 웁니다. Formatter는 그래프의 객체 유형을 가진 직렬화 인포를 만듭니다. 프록시를 스스로 보내야하는 개체는 SerializationInfo에서 FullTypename 및 AssemblyMame 메소드를 사용하여 전송 된 정보를 변경할 수 있습니다.

클래스 상속의 경우, 이소화 가능한 기본 클래스에서 파생 된 클래스를 일련의 클래스를 일련화 할 수 있습니다. 이 경우 파생 클래스는 GetObjectData 구현 내에서 GetObjectData의 기본 클래스 구현을 호출해야합니다. 그렇지 않으면 기본 클래스의 데이터는 직렬화되지 않습니다.

이랑 ISerializable 이진 직렬화를 수행 할 때 직렬화를 인수하여 Binaryformatter에서 사용하는 기본 접근 방식과 다른 방식으로 객체를 직렬화하기 위해 객체에 사용자 정의 메소드를 작성할 수 있습니다.

다시 말해, 기본 접근법이 객체를 직렬화하려는 방식과 다른 방식으로 직렬화되면 완전한 제어를 위해 iserializable을 구현할 수 있습니다. iserializable과 손으로 손을 잡고 구현 해야하는 사용자 정의 생성자도 있습니다.

XMLSerialization은 물론 특성 만 사용하며, iserializable은 XML 직렬화와 관련이 없습니다.

댓글에 대해 Marc와 Pop에게 감사합니다. 첫 번째 대답으로 약간 성급했습니다.

객체를 "운송 가능"으로 만들려면 직렬화해야합니다. 예를 들어, .NET 리모 팅 또는 웹 서비스를 사용하여 객체 데이터를 전송하려면 객체 데이터를 직렬화하는 메소드를 제공하여 객체 인스턴스를 객체의 고 충실도 표현을 나타내는 전송 가능한 형식으로 줄여야합니다.

그런 다음 직렬화 된 표현을 취하고 다른 기계와 같은 다른 컨텍스트로 전송하고 원래 객체를 재건 할 수 있습니다.

구현할 때 ISerializable 인터페이스, 클래스는 인터페이스에 포함 된 getObjectData 메소드와 SerializationInfo의 인스턴스 및 StreamingContext 인스턴스의 두 매개 변수를 수용 할 수있는 특수 생성자를 제공해야합니다.

클래스가 객체 상태를 세밀하게 제어 할 필요가 없다면 만 사용할 수 있습니다. [Serializable] 기인하다. 직렬화 프로세스에 대한 더 많은 제어가 필요한 클래스는 Iserializable 인터페이스를 구현할 수 있습니다.

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