직렬화 및 역 직렬화는 사전을 백업 필드로 사용할 수 없습니다.

씨앗

속성 뒤의 지원 필드에 숨겨져있을 때 사전의 직렬화 / 비 직렬화에 이상한 문제가 발생했습니다.

다음은 Fiddle입니다 : https://dotnetfiddle.net/RFZEur

최종 결과 :

  • 언어 : C #
  • 프레임 워크 : .Net Framework 4.8
  • <int, string> 과의 쌍 조합 이있는 개인 지원 필드 가 있습니다.
  • 문자열 목록 으로 직렬화 할 수 있습니다 (참조 된 지원 필드를 가리키는 int 없음).
  • 직렬화 목록에서 역 직렬화 할 수 없습니다 . 백업 사전이 채워지지 않습니다.
public class SanityChecks
{
    private readonly ITestOutputHelper _testOutputHelper;
    public SanityChecks(ITestOutputHelper testOutputHelper)
    {
        _testOutputHelper = testOutputHelper;
    }
    public class TestClass 
    {
        [JsonIgnore]
        public Dictionary<int,string> _prvList = new Dictionary<int, string>();
        public IEnumerable<string> ListValues
        {
            get => _prvList.Select(p=> p.Value).ToList();
            set
            {
                var valArr = value.ToArray();
                for (var x = 0; x < valArr.Length; x++)
                {
                    _prvList.Add(x,valArr[x]);
                }
            }
        }
    }
    [Fact]
    public void SanityCheck_CanDeserialize()
    {
        var assumption = "{\"ListValues\":[\"TestValue\",\"AAA\"]}";
        var actual = JsonConvert.DeserializeObject<TestClass>(assumption);
        Assert.Equal(2, actual._prvList.Count());
        Assert.Equal(2, actual.ListValues.Count());
    }
    [Fact]
    public void SanityCheck_CanSerialize()
    {
        var assumption = new TestClass() { ListValues = new[] { "TestValue", "AAA" } };
        var actualSerialized = JsonConvert.SerializeObject(assumption);
        _testOutputHelper.WriteLine(actualSerialized);
        Assert.Equal("{\"ListValues\":[\"TestValue\",\"AAA\"]}", actualSerialized);
    }
    [Fact]
    public void SanityCheck_CanDeserializeFromSerialized()
    {
        var assumption = new TestClass() { ListValues = new[] { "TestValue", "AAA" } };
        var actualSerialized = JsonConvert.SerializeObject(assumption);
        _testOutputHelper.WriteLine(actualSerialized);
        var actualDeserialized = JsonConvert.DeserializeObject<TestClass>(actualSerialized);
        Assert.Equal(2, actualDeserialized._prvList.Count());
        var actualDeserializedSerialized = JsonConvert.SerializeObject(actualDeserialized);
        _testOutputHelper.WriteLine(actualDeserializedSerialized);
        Assert.Equal(actualSerialized, actualDeserializedSerialized);
    }
}

이 결과를 검색하는 방법에 대한 조언이 있으면 열려 있습니다. 테스트 목적으로 XUnit을 사용하고 있지만 바이올린은 콘솔 응용 프로그램을 만들기 위해 약간의 수정으로 아래 테스트를 빠르게 구현합니다.

ISerializable객체 구현을 시도했지만 동일한 문제가 발생했습니다.

주목할만한 이상한 점 : 내부에서 Get 절을 제거IEnumerable 하면 역 직렬화가 작동합니다 (직렬화가 더 이상 작동하지 않음).

편집 : 추가 명확성을 위해 문자열 목록으로 직렬화 할 int, string 쌍의 매핑이 필요하며 int, string 쌍의 모음으로 직렬화 해제 할 수 있도록 동일한 직렬화 된 버전이 필요합니다.

Fiddle의 경우 : 예외가 발생해서는 안됩니다. XUnit의 경우 : 모든 테스트를 통과해야합니다.

브라이언 로저스

ListValuesdeserialization 후 열거 형이 비어있는 이유 는 다음과 같은 요인 때문입니다.

  1. 기본적으로 Json.Net은 새 값을 만드는 대신 역 직렬화 중에 기존 개체 값을 재사용합니다. 따라서와 같은 속성의 ListValues경우 먼저 접근 자를 호출하고 기존 목록을 찾은 다음 계속해서 JSON에서 채 웁니다.
  2. 의 접근 ListValues자는 매번 동일한 목록 인스턴스를 반환하지 않습니다. 항상 _prvList지원 필드 에서 새 인스턴스를 만듭니다 .

결과적으로 deserialization 중에 발생하는 작업은 다음과 같습니다.

  1. serializer는 ListValues접근 자를 호출 하여 사전에서 만든 새 빈 목록을 반환합니다.
  2. 직렬 변환기는 JSON에서 해당 목록을 채 웁니다.
  3. 채워진 목록은 버려집니다 (시리얼 라이저는 TestClass인스턴스에 이미 목록에 대한 참조가 있다고 가정 하므로 mutator를 호출하지 않습니다).
  4. 테스트가 나중에 ListValues접근 자를 호출 하면 사전에서 다시 생성 된 새로운 빈 목록을 반환합니다.

ObjectCreationHandling설정을 로 설정하여 serializer의 동작을 변경할 수 있습니다 Replace. 역 직렬화 중에이 설정을 적용하면 테스트를 통과 할 수 있습니다. 여기 바이올린 .

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

사전을 이진으로 직렬화 및 역 직렬화

분류에서Dev

JSON에서 사전을 역 직렬화 할 수 없습니다.

분류에서Dev

직렬화 후 저지로 json을 역 직렬화 할 수 없습니까?

분류에서Dev

xml을 List <T>로 역 직렬화 할 수 없습니다.

분류에서Dev

json을 제대로 역 직렬화 할 수 없습니다.

분류에서Dev

JSon을 C #으로 역 직렬화 할 수 없습니다.

분류에서Dev

ServiceStack은 객체로 사전 직렬화 및 역 직렬화

분류에서Dev

Jackson의 다형성 직렬화 / 역 직렬화 및 사용자 지정 직렬화 / 역 직렬화

분류에서Dev

C # MVC는 튜플을 역 직렬화 할 수 없습니다.

분류에서Dev

NSMutableDictionary를 상속하고 NSKeyedArchiver로 직렬화 된 사용자 지정 개체는 역 직렬화 할 수 없습니다.

분류에서Dev

FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES를 사용할 때 필드를 역 직렬화 할 수 없습니다.

분류에서Dev

XStream은 Java로 역 직렬화 할 때 필드 이름을 별칭으로 지정할 수 없습니다.

분류에서Dev

직렬화 할 수없는 필드 목록을보고하는 Jackson 직렬화

분류에서Dev

jackson @JsonTypeInfo 주석을 사용하여 객체를 원래 유형으로 역 직렬화 할 수 없습니다.

분류에서Dev

인터페이스로 형식을 역 직렬화 할 수 없습니다.

분류에서Dev

bndtools osgi 프로젝트에서 xml을 역 직렬화 할 수 없습니다.

분류에서Dev

NoClassDefFoundError로 인해 XStream이 XML을 역 직렬화 할 수 없습니다.

분류에서Dev

현재 JSON 개체를 역 직렬화 할 수 없습니다. 그룹 열을 사용하여 현재 JSON 개체를 역 직렬화 할 수 없습니다.

분류에서Dev

JsonUtility로 데이터를 역 직렬화 할 수 없습니다.

분류에서Dev

Symfony serializer가 \ DateTime으로 역 직렬화 할 수 없습니다.

분류에서Dev

문자열로 역 직렬화 할 수 없습니다.

분류에서Dev

튜플을 역 직렬화 할 수 없습니다.

분류에서Dev

CouchDB에서 Json을 역 직렬화 할 수 없습니다.

분류에서Dev

JSON을 역 직렬화 할 수 없습니다.

분류에서Dev

JSON 응답을 역 직렬화 할 수 없습니다.

분류에서Dev

Zoho Docs API 응답을 역 직렬화 할 수 없습니다.

분류에서Dev

json 배열을 역 직렬화 할 수 없습니다.

분류에서Dev

Jackson을 사용하여 JAVA 클래스를 대상으로하는 JSON 직렬화 및 역 직렬화

분류에서Dev

Jackson을 사용하여 Lambda 직렬화 및 역 직렬화

Related 관련 기사

  1. 1

    사전을 이진으로 직렬화 및 역 직렬화

  2. 2

    JSON에서 사전을 역 직렬화 할 수 없습니다.

  3. 3

    직렬화 후 저지로 json을 역 직렬화 할 수 없습니까?

  4. 4

    xml을 List <T>로 역 직렬화 할 수 없습니다.

  5. 5

    json을 제대로 역 직렬화 할 수 없습니다.

  6. 6

    JSon을 C #으로 역 직렬화 할 수 없습니다.

  7. 7

    ServiceStack은 객체로 사전 직렬화 및 역 직렬화

  8. 8

    Jackson의 다형성 직렬화 / 역 직렬화 및 사용자 지정 직렬화 / 역 직렬화

  9. 9

    C # MVC는 튜플을 역 직렬화 할 수 없습니다.

  10. 10

    NSMutableDictionary를 상속하고 NSKeyedArchiver로 직렬화 된 사용자 지정 개체는 역 직렬화 할 수 없습니다.

  11. 11

    FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES를 사용할 때 필드를 역 직렬화 할 수 없습니다.

  12. 12

    XStream은 Java로 역 직렬화 할 때 필드 이름을 별칭으로 지정할 수 없습니다.

  13. 13

    직렬화 할 수없는 필드 목록을보고하는 Jackson 직렬화

  14. 14

    jackson @JsonTypeInfo 주석을 사용하여 객체를 원래 유형으로 역 직렬화 할 수 없습니다.

  15. 15

    인터페이스로 형식을 역 직렬화 할 수 없습니다.

  16. 16

    bndtools osgi 프로젝트에서 xml을 역 직렬화 할 수 없습니다.

  17. 17

    NoClassDefFoundError로 인해 XStream이 XML을 역 직렬화 할 수 없습니다.

  18. 18

    현재 JSON 개체를 역 직렬화 할 수 없습니다. 그룹 열을 사용하여 현재 JSON 개체를 역 직렬화 할 수 없습니다.

  19. 19

    JsonUtility로 데이터를 역 직렬화 할 수 없습니다.

  20. 20

    Symfony serializer가 \ DateTime으로 역 직렬화 할 수 없습니다.

  21. 21

    문자열로 역 직렬화 할 수 없습니다.

  22. 22

    튜플을 역 직렬화 할 수 없습니다.

  23. 23

    CouchDB에서 Json을 역 직렬화 할 수 없습니다.

  24. 24

    JSON을 역 직렬화 할 수 없습니다.

  25. 25

    JSON 응답을 역 직렬화 할 수 없습니다.

  26. 26

    Zoho Docs API 응답을 역 직렬화 할 수 없습니다.

  27. 27

    json 배열을 역 직렬화 할 수 없습니다.

  28. 28

    Jackson을 사용하여 JAVA 클래스를 대상으로하는 JSON 직렬화 및 역 직렬화

  29. 29

    Jackson을 사용하여 Lambda 직렬화 및 역 직렬화

뜨겁다태그

보관