Я пытаюсь взять объект с такой структурой
public class Item
{
public Guid SourceTypeID {get;set;}
public Guid BrokerID {get;set;}
public double Latitude {get;set;}
public double Longitude {get;set;}
public DateTime TimeStamp {get;set;}
public object Payload {get;set;}
}
и сериализовать это с JSON.NET с помощью вызова типа:
Item expected = new Item()
{
SourceTypeID = Guid.NewGuid(),
BrokerID = Guid.NewGuid(),
Latitude = 33.657145,
Longitude = -117.766684,
TimeStamp = DateTime.Now,
Payload = new byte[]{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
};
string jsonString = JsonConvert.SerializeObject(expected);
Член полезной нагрузки объекта Item потенциально будет содержать любой примитив из списка примитивов C # (плюс несколько других, таких как Guid), или массив этих типов (как в Например, байтовый массив) или «плоский» объект, состоящий из любого из перечисленных ранее «примитивов» (создаваемых динамически).
Когда я выполняю вызов SerializeObject (), создаваемая строка содержит:
{"Payload":"AAECAwQFBgcICQ==","SourceTypeID":"d8220a4b-75b1-4b7a-8112-b7bdae956a45",
"BrokerID":"951663c4-924e-4c86-a57a-7ed737501dbd",
"TimeStamp":"\/Date(1328202421559-0600)\/",
"Latitude":33.657145,"Longitude":-117.766684}
Однако, когда я вызываю десериализацию, созданный элемент частично неверен.
Item actual = JsonConvert.DeserializeObject<Item>(jsonString);
actual.SourceTypeID : {00000000-0000-0000-0000-000000000000}
actual.BrokerID : {951663c4-924e-4c86-a57a-7ed737501dbd}
actual.Latitude : 33.657145;
actual.Longitude : -117.766684;
actual.TimeStamp : {2/2/2012 11:07:01 AM}
actual.Payload : null
Член SourceTypeID (Guid) и полезная нагрузка member (объект, содержащий byte []), оба неверны. Сериализованная строка, похоже, содержит правильную идентификацию для guid, но не для байтового массива.
Я вижу, что альтернативная сигнатура SerializeObject -
SerializeObject(object value, params JsonConverter[] converters);
. Это правильный способ сообщить механизму де / сериализации о типах, которые он явно неправильно обрабатывает? Поскольку я работаю с ограниченным набором «примитивов» в основе моего объекта, если бы я мог создать набор преобразователей для каждого из этих типов, решило бы это мою проблему?
Я хочу по возможности не изобретать велосипед, так как кажется, что это проблема, которая уже была изящно решена, и я хотел бы использовать что-то подобное, если таковое имеется.