문제

C#의 DateTime 객체를 기본값과 다른 형식을 사용하여 직렬화하도록 노력하고 있습니다. 우리는 밀리 초를 포함시키고 싶지 않습니다. SortabledateTimePattern 및 UniversalSortortableDateTimePattern은 읽기 전용입니다.

도움이 되었습니까?

해결책

서버에서 보내는 데이터 콘텐츠의 DateTime 인스턴스에 대해 이야기하고 있다고 가정하면,이를 수행하는 간단한 방법은 없다고 생각합니다. 당신이 언급 한 패턴은 사용되지 않았다 (만약 그렇다면, 심한 솔루션을 위해 반사를 통해 공유 패턴 인스턴스를 해킹 할 수있다). DataContractSerializer는 궁극적으로 작업을 내부 XSDDATETIME.TOSTRING () 메소드로 위임하는데, 이는 0이 아닌 경우 항상 분수 초를 방출하도록 하드 코딩됩니다.

우아하지는 않지만 하드 코딩 된 동작을 이용하는 것이 가장 간단한 솔루션 일 수 있습니다. 서버를 떠나기 전에 밀리 초를 0으로 재설정하면서 모든 데이터를 복사하기 만하면됩니다.

또는 영향을받는 작업에서 사용자 정의 IDISPatchMessageFormatter 또는 IDISPatchMessageInspector를 연결하는 것이 남아 있습니다. 그들이 일반적이고 연결하기 쉽기를 원한다면 공원에서의 산책도 아닙니다.

궁금한 점이 있습니다. 분수 초를 이해하지 못하는 잘못된 행동 클라이언트가 있습니까?

다른 팁

이 문제를 처리하는 몇 가지 방법을 알아 냈습니다. 더 복잡한 방법은 사용자 정의 MessageFormatter 엔드 포인트의 고리를 포함합니다.

우리는 이것에 대한 간단한 방법을 찾았습니다.

초 분수는 DateTime 객체에있는 경우에만 생성됩니다.

우리가 한 일 :

반사를 사용하여 DateTime Datatyp을 감지하는 정적 ON PropertyChange 이벤트 핸들러를 만들었습니다. 발견되면 우리는 초 분수없이 DateTime을 재현합니다. 우리의 경우 우리는 몇 초를 전혀 신경 쓰지 않았습니다. 부분 클래스 생성자에서 이벤트를 연결합니다. 그게 다야.

물론

public static class DateTimeSecondCatcher
{
    PropertyInfo dateTimePropertyInfo = sender.GetType().GetProperty(e.PropertyName);
        if ((dateTimePropertyInfo != null) && (dateTimePropertyInfo.PropertyType == typeof(DateTime)))
        {

            DateTime dteValue = (DateTime)dateTimePropertyInfo.GetValue(sender, null);
            if (dteValue.Millisecond > 0)
            {
                dateTimePropertyInfo.SetValue(sender, new DateTime(dteValue.Year,dteValue.Month,dteValue.Day, dteValue.Hour,dteValue.Minute,dteValue.Second,0,dteValue.Kind), null);
            }
        }

}


// This code goes in the partial class constructor
this.PropertyChanged += new PropertyChangedEventHandler(DateTimeSecondCatcher.OnPropertyChanged);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top