2016-09-12 2 views
2

У меня есть проблемы с сериализацией Int32 и получением Int64 при десериализации. Моя проблема более общая, у меня есть массив object s, который может содержать Int32 рядом с Int64.Как де-/сериализовать произвольные данные при сохранении типов?

Поэтому я не могу написать собственный конвертер при десериализации и слепо предположить, что все Int32/Int64.

Как обрабатывать сериализацию/десериализацию в таком случае?

+0

Являются ли эти вхождения Int32 предсказуемыми? –

+0

Похож на [JSON.net (de) сериализовать нетипизированное свойство] (https://stackoverflow.com/questions/38777588/json-net-deserialize-untyped-property). – dbc

+0

@ DominiqueLorre, нет, совсем нет. – astrowalker

ответ

0

Вы можете использовать UntypedToTypedValueConverter от JSON.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); 

Sample fiddle.

+0

Большое спасибо, но это неловко, потому что даже в простейшем случае (как и выше) я возвращаю все значения, завернутые. На данный момент я не могу сказать, почему, но «WriteJson» вызывается так, как вы ожидали, но «ReadJson» полностью игнорируется. Я смотрю и смотрю и не понимаю, почему это игнорируется. – astrowalker

+0

@astrowalker - Я добавил образец [скрипка] (https://dotnetfiddle.net/FPdg5B). – dbc

+0

Спасибо, наконец, нашли! Если вы добавите явный конструктор для 'RootObject', который возьмет массив объектов и установит' Items', метод 'ReadJson' будет ** не ** вызываться. Еще раз большое спасибо! (Я ставлю upvotes, но они не видны). – astrowalker

Смежные вопросы