2016-09-12 4 views
2

나는 비 직렬화 중에 Int32을 직렬화하고 Int64을 얻는 것에 관한 문제를 염두에두고 있습니다. 내 문제는 좀 더 일반적이며, Int32 옆에 Int64를 수용 할 수있는 object 배열이 있습니다.유형을 유지하면서 임의의 데이터를 직렬화/직렬화하는 방법은 무엇입니까?

그래서 deserialization에 사용자 지정 변환기를 쓸 수없고 모든 것이 Int32/Int64라고 가정합니다.

그런 경우 직렬화/직렬화를 처리하는 방법은 무엇입니까?

+0

이러한 Int32의 발생은 예측 가능합니까? –

+0

[JSON.net (de) serialize untyped property]와 유사합니다 (https://stackoverflow.com/questions/38777588/json-net-deserialize-untyped-property). – dbc

+0

@DominiqueLorre, 아니, 전혀. – astrowalker

답변

0

당신은 한 가지 차이점은 UntypedToTypedValueConverterJSON.net (de)serialize untyped property에서 사용할 수 있습니다 - 당신은 예를 들어, [JsonProperty(ItemConverterType = typeof(UntypedToTypedValueConverter))]를 사용하여 배열 자체가 아닌 배열 항목에 적용해야합니다

public class RootObject 
{ 
    [JsonProperty(ItemConverterType = typeof(UntypedToTypedValueConverter))] 
    public object [] Items { get; set; } 
} 

이이 항목에 컨버터를 적용 배열 그 자체가 아니라 배열. 그런 예컨대, 직렬화 및 JsonSerializerSettings.TypeNameHandling = TypeNameHandling.Auto와 역 직렬화 :

var root = new RootObject { Items = new object[] { 1, 1L, int.MaxValue, long.MaxValue } }; 
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }; 
var json = JsonConvert.SerializeObject(root, settings); 
var root2 = JsonConvert.DeserializeObject<RootObject>(json, settings); 

샘플 fiddle을.

+0

대단히 고맙습니다. 비록 위와 같은 간단한 경우조차도 모든 값을 되돌려 놓았 기 때문에 이것은 당혹 스럽습니다. 지금은 이유를 말할 수는 없지만'WriteJson'은 당신이 기대했던대로 호출되지만'ReadJson'은 완전히 무시됩니다. 나는보고 외견하고 왜 그것이 무시되는지 보지 못한다. – astrowalker

+0

@astrowalker - 샘플 [피들] (https://dotnetfiddle.net/FPdg5B)을 추가했습니다. – dbc

+0

감사합니다. 마침내 발견했습니다! 오브젝트의 배열을 취하는'RootObject'의 명시적인 생성자를 추가하고'Items'를 설정하면'ReadJson' 메소드가 호출되지 않습니다 **. 다시 한번 감사드립니다! (나는 upvotes를 넣었지 만 보이지 않는다). – astrowalker

관련 문제