나는 내 자신이 쓴 것이 아니기 때문에 내가 기억할 필요가있는 대상을 가지고있다. 개체는 ICloneable 또는 Serializable 태그가 지정되지 않으므로 인터페이스 또는 직렬화를 통한 심층 복제가 작동하지 않습니다. 어쨌든이 객체를 깊게 복제 할 수 있습니까? 비보안 win32 API 호출이 가능합니까?ICloneable 또는 Serializable 태그가없는 C# 개체를 딥 클론 할 수 있습니까?
답변
FYI ICloneable로 표시된 FYI 인터페이스는 예외적으로 복사되지 않습니다. ICloneable을 구현하는 것은 구현 자의 몫이며 복제 할 사람은 없습니다. 개체에 ISerializable이 구현되어 있지 않지만 Serializable 특성이 있습니까?
바이너리 직렬화를 통해 딥 복사본을 만드는 것은 알고있는 가장 쉬운 방법 중 하나입니다. 복잡한 그래프를 3-5 줄의 코드로 복제 할 수 있기 때문에 가능합니다. 또 다른 옵션은 개체가 XmlSerialized가 될 수있는 경우 XmlSerializer입니다. 직렬화에 대한 특성을 구체화하지 않거나 인터페이스를 구현하는 인터페이스를 구현하는 경우에는 IDictionary 인터페이스가있는 경우
외부에서는 아무 것도 생각할 수 없습니다. . 모든 데이터를 공개적으로 액세스 할 수 있다면 자신의 복제 루틴을 수행 할 수 있습니다. 리플렉션을 사용하여 개인 데이터를 설정하여 복제 할 수 없다면
나는 이것을 할 수있는 유일한 방법이 있다고 생각합니다. 객체와 모든 멤버 (멤버가있는 다른 객체 일 수도 있음)를 따로 떼어내는 심각한 리플렉션입니다. 프레임 워크 직렬자가 수행하는 것이지만 적절하게 표시된 객체에 대해서만 수행합니다.
Mono.Cecil과 같은 산업용 등급의 리플렉션 라이브러리에 도움이 될만한 정보가 있는지 확실하지 않습니다.
견고한 범용 솔루션 (예 : 고정 회원이 제대로 처리하기 어려울 수 있음)이 나오지는 않을지 모르지만 특정 경우에 뭔가 효과가있을 수 있습니다.
[Serializable]에서 프레임 워크 serializer의 인스턴스를 우회 할 수 있습니다 - Mark의 대답을 참조하십시오. 속성의 유무에 관계없이 모든 유형의 기본 직렬화 (모든 필드 저장)를 수행하도록 속일 수 있습니다. –
"깊은"은 까다로운 비트입니다. 얕은 사본의 경우 리플렉션을 사용하여 필드를 복사 할 수 있습니다 (아무 것도 읽지 않는 가정, 이는 큰 가정입니다). 그러나 그렇지 않으면 (자동으로) 작동하게하는 것이 매우 어려울 수 있습니다.
다른 옵션은 직렬화를 직접 제공하고 (딥 클론에 직렬화) "직렬화 대리"입니다. Here's VB 예제.
나는 Surrogate와 함께 놀았으며, 표준 유형 (문자열, ints 등) 만 사용하는 한 제대로 작동하는 것 같습니다. 클래스를 속성으로 추가하려고하면 'Serialize'태그에 오류가 발생합니다. – DaveK
VB 예제 기사가 삭제되었습니다. / –
- 1. ICloneable 인터페이스 구현 C# (딥 복제)
- 2. 얼마나 효율적입니까? element.cloneNode (true) (딥 클론)?
- 3. 개체를 C# 감시자에 추가 할 수 있습니까?
- 4. C# 개체를 마샬링하지 않고 메모리에 개체를 고정 할 수 있습니까?
- 5. 레일 클론 또는 해시?
- 6. 은 C#에서 [Serializable]과 [Serializable()] 사이에 차이가 있습니까?
- 7. 레일 클론 복제 또는 복제
- 8. 브라우저에서 xmlHTTP 개체를 활성화 또는 비활성화 할 수 있습니까?
- 9. 추가 할 수없는 개체 복제 ICloneable
- 10. C# : LINQ를 사용하여 클래스 생성자에서 개체를 초기화 할 수 있습니까?
- 11. C# COM 개체를 처리 할 수 없습니다.
- 12. serializable 클래스에있는 필드를 unserialize 할 수 있습니다.
- 13. java에서 런타임에 클래스가없는 클래스에 Serializable 인터페이스를 추가 할 수 있습니까?
- 14. C#에서 DateTime 개체를 어떻게 복제 할 수 있습니까?
- 15. C#에서 긴 개체를 캐스팅 할 수 있습니까?
- 16. C#에서 제네릭 형식의 개체를 캐스팅 할 수 있습니까?
- 17. 개체를 다시 제공하는 DLL로 개체를 추적 할 수 있습니까?
- 18. petshop 4.0의 ICloneable 인터페이스에 의심의 여지가 있습니까?
- 19. 개체를 "$ this"로 deserialize 할 수 있습니까?
- 20. Silverlight에서 익명 개체를 serialize 할 수 있습니까?
- 21. COM 개체를 통해 통신 할 수 있습니까?
- 22. 브라우저 캐시에 개체를 예약 할 수 있습니까?
- 23. javax.persistence.Query 개체를 캐싱 할 수 있습니까?
- 24. 어떻게 크리스탈 또는 rdlc 보고서에서 C#의 비즈니스 개체를 바인딩 할 수 있습니까?
- 25. C#에서 const를 캐스팅 할 수 있습니까?
- 26. Serializable 표준 클로저 인터페이스가 있습니까?
- 27. Hibernate와 Serializable Entities
- 28. 파이썬 C APi 딥 복사
- 29. 개체를 캐스팅 할 수 없습니다.
- 30. Drupal의 Kickstarter 클론?
시도해주세요. http://valueinjecter.codeplex.com/wikipage?title=Deep%20Cloning&referringTitle=Home – Omu