tl;dr:
我正在结构上注册序列化器和反序列化器。
序列化器未被调用,但解串器被调用。
我怎样才能解决这个问题?
它适用于引用类型,并且执行JsConfig<Position>.TreatValueAsRefType = true;
也没有帮助。
长版:
我使用 ORMLite 存储两种复杂类型:Position(一个结构,来自我们无法控制的外部库 DotSpatial)和 Tuple。
为了能够正确地从数据库中存储/读取它们,我定义了它们的序列化器和反序列化器:
// Struct. Called by position.ToJsv(), NOT called by ORMLite's connection.Insert() .
JsConfig<Position>.SerializeFn = position =>
{
string str = position.ToString(null, CultureInfo.InvariantCulture);
return str; // Breakpoint here.
};
// Struct. Called in both.
JsConfig<Position>.DeSerializeFn = position => Position.Parse(position, CultureInfo.InvariantCulture);
// Reference type. Works fine.
JsConfig<Tuple<double, double>>.SerializeFn = tuple => string.Format(CultureInfo.InvariantCulture,
"{0}{1}{2}",
tuple.Item1, CultureInfo.InvariantCulture.TextInfo.ListSeparator, tuple.Item2
);
// Works fine too.
JsConfig<Tuple<double, double>>.DeSerializeFn = tuple =>
{
var values = tuple.Split(new[] { CultureInfo.InvariantCulture.TextInfo.ListSeparator }, StringSplitOptions.None);
double item1, item2;
if (values.Length == 2
&& double.TryParse(values[0], out item1)
&& double.TryParse(values[1], out item2))
{
var result = new Tuple<double, double>(item1, item2);
return result;
}
throw new ArgumentException("Could not parse easting and northing from database; malformatted?", "tuple");
};
调试
使用 ORMLite 从数据库读取数据时,解串器中会遇到断点:connection.Where<T>(item => item.Foo == bar)
.
使用 ORMLite 写入数据库时,不会命中序列化器中的断点:connection.Insert(item)
.
我认为序列化器可能没有正确注册,所以我打电话.ToJsv()
在物体上。
var lat = Latitude.Parse("00°00'02.7451\"N", CultureInfo.InvariantCulture);
var lon = Longitude.Parse("013°29'17.3270\"W", CultureInfo.InvariantCulture);
Position pos = new Position(lat, lon);
string foo = pos.ToJsv(); // Works, hits the breakpoint.
当遇到断点时,str =00°00'02.7451"N,013°29'17.3270"W
.
但是当使用 ORMLite 插入时,断点没有命中,我在数据库中得到了值,例如00°00'02,7451"N;013°29'17,3270"W
- 由于文化原因,请注意逗号.
数据库正在保存与文化相关的价值观! :(
Attempts
由于这种情况仅发生在结构上,因此我尝试将类型注册为引用类型,但这似乎不起作用。
JsConfig<Position>.TreatValueAsRefType = true;
Update:
我正在使用ORMLite.PostgreSQLNuget 包(v 3.9.70)。它包括 ServiceStack.Text (v 3.9.70) 和 Npgsql (v 2.0.11)。
我想尝试从源代码管理中获取代码并直接调试它,但现在我没有时间。
The Position
struct 是在外部库中定义的,我无法更改。
极简样本
我已经上传了一个极简主义样本https://gist.github.com/aneves/7830776 https://gist.github.com/aneves/7830776,显示以下输出:
Thing, current culture: 12,6;10,9
Thing, invariant culture: 12.6,10.9
Thing, from Jsv: "12,6;10,9"
>> deserializing 10;35
>> Could not parse value, it is malformed. (10;35)
Found this: Box[A: 0;0]
Press any key to continue . . .