iserializable 인터페이스의 요점은 무엇입니까?
-
03-07-2019 - |
문제
인터페이스가없는 클래스를 직렬화 할 수있는 것처럼 보이므로 그 목적이 확실하지 않습니다.
해결책
ISerializable
일반적으로 사용자 정의 이진 직렬화를 제공하는 데 사용됩니다. BinaryFormatter
(아마도 원격 목적으로). 그것 없이는 필드를 사용합니다.
- 무능한; 런타임시 효율에만 사용되지만 직렬화를 위해 제거 할 수있는 필드가있는 경우 (예 : 직렬화 될 때 사전이 다르게 보일 수 있음)
- 무능한; 필요한 필드의 경우에도 많은 추가 메타 데이터를 포함해야합니다.
- 유효하지 않은; 필드가 있다면 할 수 없습니다 직렬화 (예 : 이벤트 대의원 등).
[NonSerialized]
) - 다루기 힘든; 당신의 직렬화는 이제 필드 이름 - 그러나 필드는 구현 세부 사항입니다. 또한보십시오 난독 화, 직렬화 및 자동으로 구현 된 속성
구현하여 ISerializable
자신의 이진 직렬화 메커니즘을 제공 할 수 있습니다. 이것과 동일합니다 IXmlSerializable
, 사용 된대로 XmlSerializer
등.
DTO 목적을 위해 BinaryFormatter
피해야합니다 - XML과 같은 것들 (비아 XmlSerializer
또는 DataContractSerializer
) 또는 JSON은 프로토콜 버퍼와 같은 크로스 플랫폼 형식과 마찬가지로 양호합니다.
완전성을 위해 Protobuf-Net에는 후크가 포함되어 있습니다 ISerializable
(많은 코드를 쓰지 않고 휴대용 바이너리 형식을 사용할 수 있지만) BinaryFormatter
어쨌든 여기서 첫 번째 선택이 아닐 것입니다.
다른 팁
클래스는 .NET에서 두 가지 방법 중 하나로 직렬화 될 수 있습니다.
- 수업을 표시합니다
SerializableAttribute
그리고 당신의 모든 들판을 장식합니다 ~하지 않다 The와 직렬화되기를 원합니다NonSerialized
기인하다. (Marc Gravell이 지적했듯이BinaryFormatter
, 이것은 일반적으로 형식에 사용되는 클래스입니다ISerializable
객체는 구체적으로 달리 표시되지 않는 한 모든 필드를 자동으로 직렬화합니다.) - 구현
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 인터페이스를 구현할 수 있습니다.