我有一个像这样的POCO:
public class BlogEntry
{
public string Title { get; set; }
public DateTime Date { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
大部分时间它都是从Entity Framework中提取的,但它可以并且将在Entity Framework之外使用.
来自EF的日期的DateTimeKind是未指定的,从我读到的是正常的.
当我在Redis中缓存此POCO(使用ServiceStack Redis客户端)时,它返回DateTimeKind of Local.
因此返回的对象存在抖动.第一遍(未缓存)具有ISO-8061,没有偏移(DateTimeKind.Unspecified).第二遍(缓存)是带有偏移的ISO-8061(来自Redis with DateTimeKind.Local).
是否有任何方法可以强制ServiceStack JSON序列化程序始终将日期解释为给定的DateTimeKind?(我知道有一个"JsConfig.AppendUtcOffset"属性,但无论是真还是假,价值观永远不会改变?)
或者在我的类型化RedisClient的反序列化过程中的某个地方使DateTimeKind本地?
我可以手动更改我的POCO来强制执行DateTimeKind - 这是有效的 - 但我希望有一些不易出错的东西.
F#中的区分联合被编译为抽象类,其选项成为嵌套的具体类.
type DU = A | B
Run Code Online (Sandbox Code Playgroud)
DU是抽象的,而DU.A和DU.B是具体的.
使用ServiceStack,可以使用函数自定义类型到JSON字符串和后面的序列化.关于DU类型,这是我在C#中如何做到的.
using ServiceStack.Text;
JsConfig<DU.A>.SerializeFn = v => "A"; // Func<DU.A, String>
JsConfig<DU.B>.SerializeFn = v => "B"; // Func<DU.B, String>
JsConfig<DU>.DeserializeFn = s =>
if s == "A" then DU.NewA() else DU.NewB(); // Func<String, DU>
Run Code Online (Sandbox Code Playgroud)
F#是否了解其受歧视的工会的编制表格?如何在编译时获得F#中的DU.A类型?
typeof<DU> // compiles
typeof<DU.A> // error FS0039: The type 'A' is not defined
typeof<A> // error FS0039: The type 'A' is not defined
Run Code Online (Sandbox Code Playgroud)
我可以很容易地在F#中注册一个用于反序列化的函数.
open System
open ServiceStack.Text
JsConfig<DU>.RawDeserializeFn <-
Func<_, _>(fun s -> printfn "Hooked"; if …Run Code Online (Sandbox Code Playgroud) 我有一个JSON字符串,看起来像:
"{\"Id\":\"fb1d17c7298c448cb7b91ab7041e9ff6\",\"Name\":\"John\",\"DateOfBirth\":\"\\/Date(317433600000-0000)\\/\"}"
Run Code Online (Sandbox Code Playgroud)
我正在尝试将其反序列化为object(我正在实现一个缓存接口)
我遇到的麻烦就是我用的时候
JsonSerializer.DeserializeFromString<object>(jsonString);
Run Code Online (Sandbox Code Playgroud)
它回来了
"{ID:6ed7a388b1ac4b528f565f4edf09ba2a,名称:约翰,出生日期:/日期(317433600000-0000)/}"
是对的吗?
我无法断言任何事情......我也不能使用动态关键字....
有没有办法从ServiceStack.Text库返回一个匿名对象?
c# anonymous-types servicestack json-deserialization servicestack-text
长话短说 - 通过ServiceStack.Text的JSON解析器跳转的日期会丢失时区信息.奇怪的是,DateTimeSerializerTests.DateTime_Is_Serialized_As_Utc_and_Deserialized_as_local()似乎期待这种行为,并DateTimeSerializer.Prepare()显式调用ToLocalTime()解析为UTC的每个日期时间对象!
这是一个示例测试用例(MSTest,但很容易在任何东西中运行).本地通行证,但UTC和未指定不通过 - DateTime对象返回的类型始终为"本地".
[TestMethod]
public void TestParseSingleDateTime_UTC()
{
// In canonical UTC format
var date = "2014-06-03T14:26:20.0030000Z";
var raw = new DateTime(2014, 6, 3, 14, 26, 20, 3, DateTimeKind.Utc);
var value = DateTimeSerializer.ParseShortestXsdDateTime(date);
Assert.AreEqual(DateTimeKind.Utc, value.Kind);
Assert.AreEqual(raw, value);
}
[TestMethod]
public void TestParseSingleDateTime_Local()
{
// In local time zone
var date = "2014-06-02T11:15:49.1480000-05:00";
var raw = new DateTime(2014, 6, 2, 11, 15, 49, 148, DateTimeKind.Local);
var value = DateTimeSerializer.ParseShortestXsdDateTime(date);
Assert.AreEqual(DateTimeKind.Local, value.Kind);
Assert.AreEqual(raw, …Run Code Online (Sandbox Code Playgroud) 我最近注意到我们的一个应用程序中出现了一种奇怪的行为。
Exception=System.InvalidCastException: Unable to cast object of type 'System.Data.SqlClient.SqlTransaction' to type 'System.Byte[]'.
at ServiceStack.Text.Pools.BufferPool.GetCachedBuffer(Int32 minSize) in C:\BuildAgent\work\912418dcce86a188\src\ServiceStack.Text\Pools\BufferPool.cs:line 55
at ServiceStack.Redis.RedisNativeClient..ctor(RedisEndpoint config) in C:\BuildAgent\work\b2a0bfe2b1c9a118\src\ServiceStack.Redis\RedisNativeClient_Utils.cs:line 447
at ServiceStack.Redis.RedisClient..ctor(RedisEndpoint config) in C:\BuildAgent\work\b2a0bfe2b1c9a118\src\ServiceStack.Redis\RedisClient.cs:line 66
at ServiceStack.Redis.RedisConfig.<>c.<.cctor>b__35_0(RedisEndpoint c) in C:\BuildAgent\work\b2a0bfe2b1c9a118\src\ServiceStack.Redis\RedisConfig.cs:line 22
at ServiceStack.Redis.RedisResolver.CreateRedisClient(RedisEndpoint config, Boolean master) in C:\BuildAgent\work\b2a0bfe2b1c9a118\src\ServiceStack.Redis\RedisResolver.cs:line 76
at ServiceStack.Redis.RedisManagerPool.GetClient() in C:\BuildAgent\work\b2a0bfe2b1c9a118\src\ServiceStack.Redis\RedisManagerPool.cs:line 214
Run Code Online (Sandbox Code Playgroud)
...
或者
Exception=System.InvalidCastException: Unable to cast object of type 'System.Byte[]' to type 'System.Transactions.SafeIUnknown'.
at System.Transactions.Transaction.JitSafeGetContextTransaction(ContextData contextData)
at System.Transactions.Transaction.FastGetTransaction(TransactionScope currentScope, ContextData contextData, Transaction& contextTransaction)
at System.Transactions.Transaction.get_Current()
at System.Data.ProviderBase.DbConnectionPool.GetFromTransactedPool(Transaction& transaction)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, …Run Code Online (Sandbox Code Playgroud) 我正在使用ServiceStack.OrmLite将数据保存在SQLite数据库中,并且到目前为止对此非常满意.
但是,我的许多对象都具有复杂类型的属性,我不想将其序列化使用JSV.
我需要能够指定应该用于在数据库中存储属性的自定义序列化/反序列化(作为字符串).在db4o世界上,这相当于使用由提供的翻译功能IObjectConstructor.
无法正确序列化和反序列化的复杂类型的一个很好的例子是NodaTime类型,即使它们可以很容易地映射到字符串(我已经拥有了我使用的序列化/反序列化函数db4o).
实现这一目标的最简单方法是什么?包装器不是很方便,因为我必须为包含这种复杂类型属性的每种类型编写和维护一个包装器.
c# servicestack nodatime ormlite-servicestack servicestack-text
我JsonDateHandler在当前的Nuget ServiceStack版本4.0.5.0中找不到枚举.
有什么指针吗?
我想从框架中提出的问题太多了.但只是想知道它是否有可能.或者将会解决这个问题.
新版本的JSON.Net开始支持F#union类型.解决这个问题的方法是什么,这意味着如果我使用servicestack.text,那么我如何展平联合类型以支持序列化.
这是两者的代码示例.
type Shape =
| Rectangle of width : float * length : float
| Circle of radius : float
| Empty
[<EntryPoint>]
let main argv =
// printfn "%A" argv
let shape1 = Rectangle(1.3, 10.0)
let json = JsonConvert.SerializeObject(shape1) //JSON.net
printfn "%A" json
// {
// "Case": "Rectangle",
// "Fields": [
// 1.3,
// 10.0
// ]
// }
let shape2 = JsonConvert.DeserializeObject<Shape>(json) //JSON.Net
printfn "%A" (shape2 = shape1) //true
let sJson = JsonSerializer.SerializeToString shape1 //SS.Text
printfn …Run Code Online (Sandbox Code Playgroud) 我正在实现一个oAuth服务器并需要存储刷新令牌,为此我已经(目前)选择将令牌序列化为JSON.
虽然我可以看到JSON包含了重新水化所需的一切,但当我使用token.FromJson()反序列化时,嵌入的声明没有被正确重建.
到目前为止,我已经考虑从JsonConverter继承创建一个声明转换器,但没有看到一种方法来调整全局JsConfig来利用它:(
任何人都能指出我的方向吗?
如果可能,在使用ServiceStack.Text.CsvSerializer时如何将分隔符从逗号更改为分号?