2010-02-02 2 views
1

를 작동하지 않는 기본 클래스 속성 이름은 내가 좋아하는 기본 클래스가 다음DataContract 직렬화 -

[DataContract(Name="MyDomainObject")] 
public class MyDomainObject : SerializableDomainObject<MyDomainObject> 
{ 
    public MyDomainObject() 
    { 
    } 

    public MyDomainObject(string name) 
    { 
     Name = name; 
    } 

    [DataMember(Order = 1)] 
    public string Name { get; private set; } 
} 
:

[Serializable] 
public class SerializableDomainObject<T> 
{ 
    public SerializableDomainObject() 
    { 
     ID = Guid.NewGuid(); 
    } 

    [DataMember(Name="ID", Order = 0)] 
    public Guid ID { get; private set; } 

    public void Save() 
    { 
     // serialize 
    } 

    public void Load() 
    { 
     // deserialize 
    } 
} 
난 다음이에서 파생 된 클래스를 많이 가지고

가 여기에 하나의 예입니다

<MyDomainObject xmlns="http://schemas.datacontract.org/2004/07/DomainObjects" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <_x003C_ID_x003E_k__BackingField>2b3c00f6-1b15-4a6b-bd6c-a1f447ea5a34</_x003C_ID_x003E_k__BackingField> 
    <Name>AName</Name> 
</MyDomainObject> 

이 왜 ID 속성이 무관하지 않다 : 일단 여기 직렬화

는 출력 g는 기본 클래스의 DataMember 특성에서 제공 한 이름으로 직렬화 되었습니까?

답변

3

속성에 대한 setter를 private으로 선언했기 때문입니다.이 속성은 비공개이므로 DataContractSerializer는 배킹 필드를 serialize하고 속성 대신 이름을 사용합니다.

DataContractSerializer는 요청한 모든 멤버를 행복하게 serialize하지만 언어의 의미와 관련하여 사용합니다. 일반적으로 서비스와 클라이언트 간의 메시지 계약은 간단하고 사용하기 쉽기 때문에 데이터 컨트랙트를 간단히 선언하고 이런 가시성 제어를 많이하지 않는 것이 가장 좋습니다. 공개 및 제한되지 않은 데이터 계약을 생성하고 운영 계약을 잠급니다.

+0

이 속성을 비공개로 유지하고 이름을 지정할 수있는 방법이 있습니까? 아니면 공공 장소에서만 작동합니까? 이유는 사용자가 ID 필드를 편집 할 수있게하고 싶지 않기 때문입니다. – James

+0

정의한 이름으로 비공개로 유지하려는 경우 명시 적으로 백킹 필드를 선언하고 C#의 자동 구현 된 속성을 사용하지 마십시오. –

+0

개인 필드를 사용해 주셔서 감사합니다. – James

-1

개인 선언을 내부로 변경할 수 있습니까? 여전히 가시성 요구 사항을 충족시킬 수 있습니까? 나는 내 계약서에 그것들을 가지고있다. 아주 순조롭게 직렬화/역 직렬화한다.

+0

@Ben nope가 내부 설정기를 사용하여 작동하지 않는 것 같습니다. – James

+0

나에게도 효과가 없습니다. – Schneider