문제

다음 예제 클래스를 고려해 보세요.

[Serializable]
public class SomeClass
{
    private DateTime _SomeDateTime;

    public DateTime SomeDateTime
    {
        get { return _SomeDateTime; }
        set { _SomeDateTime = value; }
    }
}

내 규칙에 따라 클래스에 선언된 DateTime의 직렬화를 변경하고 싶습니다.이 클래스의 멤버는 자주 변경되므로 모든 변경 사항에 대해 사용자 지정 직렬 변환기를 유지하고 싶지 않습니다.또한 나는 이 동작이 하위 클래스에 의해 상속되고 모든 하위 클래스에 대해 사용자 정의 직렬 변환기를 코딩하지 않기를 바랍니다.직렬화가 웹 서비스에 의해 출력되고 있습니다.어떤 도움을 주셔서 감사합니다!

도움이 되었습니까?

해결책

개체가 직렬화될 때 사용자 지정 메서드를 호출하려면 OnSerializing 및 OnDeserializing 특성을 살펴보세요.거기에 일부 사용자 정의 논리를 구현하고 실제 데이터 유형에서 직렬화 프로세스를 분리할 수 있습니다.

다른 팁

단순히 무효 날짜 시간을 사용하는 것에 대해 생각해 보셨습니까?

public DateTime? SomeDateTime {get; set;}

이렇게하면 실제로 수업에서 합법적 인 가치로 귀무 가치를 가질 수 있습니다. 일반적으로 가능할 때마다 사용자 정의 직렬화를 피하려고합니다. 구현과 같은 사용자 정의 직렬화를 수행하면 iserializable, 당신은 그것에 붙어 있고, 다른 모든 파생 수업은 그것에 붙어 있습니다.

맞춤형 예외를 위해 iserializable 멤버를 항상 무시 해야하는 엉덩이의 고통을 기억하십니까? System.Exception은 Iserializable을 구현하므로 모든 파생 된 예외는 appDomains를 교차 할 것으로 예상되는 경우 해당 구성원을 구현해야합니다.

글쎄, "bool ShouldSerializeSomeDateTime()" 메소드를 사용하여 개별 멤버의 직렬화를 활성화/비활성화할 수 있지만 이것이 꼭 필요한 것은 아니라고 생각합니다.또 다른 일반적인 옵션은 형식 자체를 수행하는 멤버를 추가하는 것입니다.

공개 문자열 somedateTimeformatted {get {return thefield == dateTime.minValue?"" :thefield.tostring ( "r");} // 또는 어떤 형식 세트 {...반대 ...} }

가능하다면 내장된 직렬화를 고수하는 것이 더 좋습니다. 부분적으로 작성해야 하는 코드의 양을 줄이기 위해서입니다.nullable DateTime(DateTime?)에 대한 Josh의 제안은 좋은 것입니다. 하지만 여전히 빈 문자열과 형식화된 문자열이 아닐 수도 있습니다. xsi:nil 마크업을 사용할 것으로 예상됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top