2008-12-21 3 views
13

나는 내 자신이 쓴 것이 아니기 때문에 내가 기억할 필요가있는 대상을 가지고있다. 개체는 ICloneable 또는 Serializable 태그가 지정되지 않으므로 인터페이스 또는 직렬화를 통한 심층 복제가 작동하지 않습니다. 어쨌든이 객체를 깊게 복제 할 수 있습니까? 비보안 win32 API 호출이 가능합니까?ICloneable 또는 Serializable 태그가없는 C# 개체를 딥 클론 할 수 있습니까?

+0

시도해주세요. http://valueinjecter.codeplex.com/wikipage?title=Deep%20Cloning&referringTitle=Home – Omu

답변

8

FYI ICloneable로 표시된 FYI 인터페이스는 예외적으로 복사되지 않습니다. ICloneable을 구현하는 것은 구현 자의 몫이며 복제 할 사람은 없습니다. 개체에 ISerializable이 구현되어 있지 않지만 Serializable 특성이 있습니까?

바이너리 직렬화를 통해 딥 복사본을 만드는 것은 알고있는 가장 쉬운 방법 중 하나입니다. 복잡한 그래프를 3-5 줄의 코드로 복제 할 수 있기 때문에 가능합니다. 또 다른 옵션은 개체가 XmlSerialized가 될 수있는 경우 XmlSerializer입니다. 직렬화에 대한 특성을 구체화하지 않거나 인터페이스를 구현하는 인터페이스를 구현하는 경우에는 IDictionary 인터페이스가있는 경우

외부에서는 아무 것도 생각할 수 없습니다. . 모든 데이터를 공개적으로 액세스 할 수 있다면 자신의 복제 루틴을 수행 할 수 있습니다. 리플렉션을 사용하여 개인 데이터를 설정하여 복제 할 수 없다면

+0

죄송합니다 ... 제가 잘못 입력했거나 질문을 수정했습니다. BinaryFormatter를 사용하려고 시도했지만 클래스에 Serializable 특성이 없으므로 폭격을 수행했습니다. – DaveK

+0

그래, 당신이 할 수있는 최선의 방법을 소스를 수정할 수 있습니다 ;-) 나는 우리의 애플 리케이션에서 내 복사본 문서 기능을 구현하는 사랑, 그것을 deserialize serialize identifer과 빵! – JoshBerke

0

나는 이것을 할 수있는 유일한 방법이 있다고 생각합니다. 객체와 모든 멤버 (멤버가있는 다른 객체 일 수도 있음)를 따로 떼어내는 심각한 리플렉션입니다. 프레임 워크 직렬자가 수행하는 것이지만 적절하게 표시된 객체에 대해서만 수행합니다.

Mono.Cecil과 같은 산업용 등급의 ​​리플렉션 라이브러리에 도움이 될만한 정보가 있는지 확실하지 않습니다.

견고한 범용 솔루션 (예 : 고정 회원이 제대로 처리하기 어려울 수 있음)이 나오지는 않을지 모르지만 특정 경우에 뭔가 효과가있을 수 있습니다.

+0

[Serializable]에서 프레임 워크 serializer의 인스턴스를 우회 할 수 있습니다 - Mark의 대답을 참조하십시오. 속성의 유무에 관계없이 모든 유형의 기본 직렬화 (모든 필드 저장)를 수행하도록 속일 수 있습니다. –

2

"깊은"은 까다로운 비트입니다. 얕은 사본의 경우 리플렉션을 사용하여 필드를 복사 할 수 있습니다 (아무 것도 읽지 않는 가정, 이는 큰 가정입니다). 그러나 그렇지 않으면 (자동으로) 작동하게하는 것이 매우 어려울 수 있습니다.

다른 옵션은 직렬화를 직접 제공하고 (딥 클론에 직렬화) "직렬화 대리"입니다. Here's VB 예제.

+0

나는 Surrogate와 함께 놀았으며, 표준 유형 (문자열, ints 등) 만 사용하는 한 제대로 작동하는 것 같습니다. 클래스를 속성으로 추가하려고하면 'Serialize'태그에 오류가 발생합니다. – DaveK

+1

VB 예제 기사가 삭제되었습니다. / –

관련 문제