2013-11-19 7 views
2

Я использую OrmLite, и одно из моих сущностей имеет свойство типа Dictionary of DateTime и int, и оно не позволяет десериализовать это свойство. Я узнал, что это проблема сериализации Jsv. Я не прошел тест:Сериализатор ServiceStack Jsv не подходит для десериализации Словарь <DateTime, ___>

[Test] 
public void Can_serialize_and_deserialize_Dictionary_with_DateTime_key() 
{ 
    JsConfig.DateHandler = JsonDateHandler.TimestampOffset; 
    var expected = new Dictionary<DateTime, int> {{DateTime.Now, 5}}; 
    var serializedString = TypeSerializer.SerializeToString(expected); 
    var actual = TypeSerializer.DeserializeFromString<Dictionary<DateTime, int>>(serializedString); 
    Assert.AreEqual(actual.Keys.First().Year, expected.Keys.First().Year); 
} 

Может кто-нибудь предложить, как это можно исправить? Это похоже на проблему формата Jsv в целом, а не на ошибку реализации. (но я могу ошибаться)

+0

Проблема заключается в том, что JSV не может десериализовать это {2013-11-19T16: 57: 33.7901057-05: 00: 5}. Слишком много двоеточий. Вот где он запутался. – kampsj

+0

@kampsj Да. Вероятно, это ошибка в JSV-сериализаторе. Он забывает избежать этой даты с помощью "" –

ответ

2

Как обходной путь до того, как эта проблема будет исправлена ​​в servicestack.text, я назначил свои собственные функции сериализации для DateTime и DateTime?

JsConfig<DateTime>.SerializeFn = DateTimeSerializer.ToShortestXsdDateTimeString; 
JsConfig<DateTime?>.SerializeFn = time => time.HasValue ? DateTimeSerializer.ToShortestXsdDateTimeString(time.Value) : null; 

Те же функции, используемые внутри servicestack.text, но когда вы задаете свои собственные функции библиотеки будет проверять, если ваши значения потребности побега или нет.