역 직렬화 할 해당 값이없는 경우 생성자의 기본 매개 변수 값을 어떻게 사용할 수 있습니까?

세피아

코드에서 직접 인스턴스화되고 디시리얼라이저에 의해 인스턴스화되는 클래스가 있습니다. 일반적으로 ImmutablePropertyStore 객체의 JSON 표현에 모든 생성자 매개 변수에 대한 값이 있습니다.이 경우 예상대로 작동합니다. 그러나 때때로 JSON 표현에서 일부 또는 모든 값이 누락 될 수 있습니다. 이 경우 json.NET이 생성자에 제공된 기본 매개 변수를 사용하기를 바랍니다. 그러나 이러한 기본 매개 변수를 무시하고 대신 누락 된 값이 해당 데이터 유형의 기본값 (부울의 경우 false)으로 설정된 클래스를 인스턴스화하는 것으로 보입니다.

아래 예제 코드는 문제를 보여줍니다 (실제로 더 많은 속성이 있습니다).

using System;
using Newtonsoft.Json;

public class Program
{
    public static void Main()
    {
        ImmutablePropertyStore immutablePropertyStore = new ImmutablePropertyStore();
        Console.WriteLine(immutablePropertyStore);
        string jsonRepresentation = JsonConvert.SerializeObject(immutablePropertyStore, Formatting.Indented);
        Console.WriteLine(JsonConvert.DeserializeObject<ImmutablePropertyStore>(jsonRepresentation));

        // Desired output: Property A is 'True' and Property B is 'True'.     Actual Output: Property A is 'False' and Property B is 'True'.
        Console.WriteLine(JsonConvert.DeserializeObject<ImmutablePropertyStore>("{\"PropertyB\": true}")); 

        // Desired output: Property A is 'True' and Property B is 'False'.     Actual Output: Property A is 'False' and Property B is 'False'.
        Console.WriteLine(JsonConvert.DeserializeObject<ImmutablePropertyStore>("{}"));

    }
}

public class ImmutablePropertyStore
{
    public bool PropertyA { get; }
    public bool PropertyB { get; }

    public ImmutablePropertyStore(bool propertyA = true, bool propertyB = false)
    {
        PropertyA = propertyA;
        PropertyB = propertyB;
    }

    public override string ToString()
    {
        return $"Property A is '{PropertyA}' and Property B is '{PropertyB}'.";
    }

}

또는 .NET 바이올린 : https://dotnetfiddle.net/ft7fGQ

출력의 마지막 줄은 다음과 같습니다.

속성 A는 'True'이고 속성 B는 'False'입니다.

보다는 :

속성 A는 'False'이고 속성 B는 'False'입니다.

다음과 같은 방식으로이를 달성하려면 어떻게해야합니까?

  1. 클래스의 불변성을 유지합니다 (공용 세터 없음).

  2. 기본값을 한 곳에서 지정하고 직렬화 해제를 통한 직접 인스턴스화 및 인스턴스화에 모두 사용할 수 있습니까?

페르 민

사용자 지정을 작성하거나에 JsonConverter대한 생성자 매개 변수를 ImmutablePropertyStorenullable로 만들고 기본값을로 설정할 수 null있습니다. 그런 다음 ctor 내부에서 '실제'기본값이 무엇인지 결정할 수 있습니다.

public ImmutablePropertyStore(bool? propertyA = null, bool? propertyB = null)
{
  PropertyA = propertyA ?? true;
  PropertyB = propertyB ?? false;
}

앞서 언급했듯이 속성 유형의 기본값이 사용 된 다음 ( null널 가능 유형의 경우) ctor에서 올바른 '실제'값으로 변환됩니다.

이 방법을 사용하면 기본값이 명확하지 않지만 문제가 될지 여부는 확실하지 않습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관