2012-09-24 3 views
4

가능한 중복 : 아래에 명시된 바와 같이
Why XML-Serializable class need a parameterless constructor왜 매개 변수없는 생성자가 필요합니까?

내가 런타임 오류를 받고 있어요.

메시지 = OutlookAddIn1.DeviceRegistrationRequest는 매개 변수없는 생성자가 없기 때문에 직렬화 할 수 없습니다.

저는 (왜 오류 메시지에 나온 것입니까?) 그리고 그것을 해결하는 방법 (빈 생성자를 추가하는 것)은 아주 분명합니다. 내가 명확하지 않은 부분은 입니다. 이유는입니다. 나는 this discussion을 찾았지만, 주로 내 프로그램 (CRM Dynamics의 콘솔 클라이언트)과 아무 관련이없는 MVC에 관한 내용입니다.

+0

를 만들기위한 당신의 자신의 공장 방법을 제공하지 않기, 그것은이의 총장 직렬화하지만 sitll가 매우 가까운 – quetzalcoatl

답변

2

아니요 MVC (죄송합니다. 게시물을 잘못 읽었습니다)에 대해 아무 것도 없습니다. 그것은 단지 평범한 C# 'py 객체 생성에 관한 것입니다. 당신의 객체가 직렬화 및 구성 될 때

public class Why { 
    public Why(int x, int y) { } 
} 

방법 디시리얼라이저 무엇을 전달하는 알 것 : 당신은 예를 들어,이 수업을 참조하십시오? 그는 추측 할 수 없었다. 따라서 프레임 워크 에는이라는 serializable 객체 에 매개 변수없는 생성자가 있어야하므로 "작성"하는 것이 안전하며 속성을 통해 책임자 책임자 전체 상태를 설정할 수 있어야합니다.

참고 : 참고로, 생성자 은 공개 일 필요가 없습니다.. 대부분의 serializer는 개인 매개 변수가없는 생성자 또는 완전히 초기화되지 않은 객체 생성을 사용하도록 구현 된 경우 전혀 사용하지 않습니다.이 객체는 적어도 .Net 전체 프로필에서 Reflection에서 사용할 수 있습니다.

+1

XML 직렬화에 대한 요구 사항 일뿐입니다. 그것은 본질적으로 요구 사항은 아닙니다. 예를 들어 이진 포맷터는 매개 변수없는 생성자를 필요로하지 않으며 개인용 생성자도 필요하지 않습니다. –

+1

마지막 코멘트가 정확하지 않습니다 : 많은 다른 serializer ('BinaryFormatter','DataContractSerializer' 등)의 경우에도 private parameterless 생성자 **가 사용되지 않습니다 ** (필수 사항은 아닙니다). 일부는 개인 생성자를 사용하지만 종종 요구하지도 않습니다. –

+0

네, 일부 시리얼 라이저는 이것을 할 수 있습니다 - 일부는 초기화되지 않은 객체를 생성하는 것과 같은 "더러운 트릭"을 사용하기 때문에 :) 아직이 설명이 마음에 들지 않습니다. 너무 자세하지 않고 OO 의미에서 꽤 자연 스럽습니다. – quetzalcoatl

1

매개 변수화 된 생성자에 대해 알지 못하는 코드는 규칙을 기반으로 개체 중 하나를 생성 할 수 있으므로 매개 변수없는 생성자를 사용할 수 있어야합니다.

역 직렬화시 및 개체 인스턴스가 필요하므로 deserialization 프로세스에서이 생성자를 사용하여 인스턴스를 만들 수 있습니다.

0

이 문제의 지금이 정확한 세부 사항보고,하지만 일반적으로 이야기 : 당신 타입의 객체를 생성 할 수

당신의 직렬화 순서대로 기본ctor이 필요합니다. 당신이 그것을 가지고 있지 않다면, 그것을 할 수있는 방법이 없습니다. 알아낼 수있는 방법이 없습니다. ctor 매개 변수를 전달하는 올바른 매개 변수가 있으므로 "매개 변수가없는"매개 변수가 없어집니다.

+1

복제 사실, 거의 시리얼 라이저는 –

+0

이 @MarcGravell 매개 변수없는 생성자가 필요됩니다 반드시 XML : 동의를, 하지만 사용 된 것은 OP에 의하면 실제로 그걸 필요로하는 것 같습니다. – Tigran

+0

요점은 다음과 같습니다. "직렬화에 기본 ctor가 필요합니다."... 음, 확실하지 않습니다. * 특정 serializer *가 필요할 수도 있지만 * serialization *에는 그러한 것이 필요하지 않습니다. –

1

인스턴스를 생성하기위한 직렬화 해제. 당신이 그것을 숨기기 원한다면 개인 또는 내부 construcotr 할 수 있습니다.

0

디시리얼라이저가 클래스의 인스턴스를 쉽게 만들고 데이터로 채울 수 있어야하기 때문입니다.

매개 변수없는 생성자가없는 경우, 디시리얼라이저는 생성자에 보낼 매개 변수를 추측해야합니다. 생성자가 어떤 매개 변수를 가져야하는지에 대한 규칙이 있다면 합리적으로 잘 작동 할 수 있지만 가장 쉬운 방법은 매개 변수가없는 생성자가 있어야한다는 것입니다.

6

사용중인 라이브러리 (아마도 간접적으로 XmlSerializer 같은 소리)는 해당 생성자를 예상하고 사용하므로 매개 변수없는 작성자 만 필요합니다.

object obj = Activator.CreateInstance(type); 

사용 : 그것은이 허용 이것은 참으로 개체를 만들 수있는 매우 편리한 방법입니다.

그러나! 이것은 모든 시리얼하여 고유 한 요구되지 않습니다 :

당신을 허용 시리얼 라이저가
  • 를 (객체를 생성 완전히 생성자 단계를 건너 뛰는 또 다른 방법이) 어떤 생성자를 사용하지 않는 시리얼 라이저가
    • 새로운 인스턴스
  • +1

    매개 변수없는 생성자를 사용하지 않는 serializer를 제공 할 수 있습니까? [Jamby] (http://stackoverflow.com/questions/15212051/c-sharp-serialize-a-class-without-a-parameterless-constructor) '모든 Serializer 클래스에는 매개 변수없는 생성자가 필요합니다. ' – zionpi

    관련 문제