我在序列化ObservableCollection of Lines (Shape)时遇到了一些麻烦。我正在为Windows RT开发,我正在使用JSON。净v5.02。对于下面的代码,我得到了以下异常:
ObservableCollection<Line> lines;
//some code
string linesString = JsonConvert.SerializeObjectAsync(lines); // problem
类型为
Newtonsoft.Json.JsonSerializationException
的例外发生在mscorlib.dll中,但未在用户代码中处理附加信息:从'X1'上获取值出错"Windows.UI.Xaml.Shapes.Line"。
如果有此异常的处理程序,程序可能是安全的继续。
这是一个错误,是否有可能的解决方案?
您的问题是一个跨线程问题。当使用await JsonConvert.SerializeObjectAsync(lines);
时,该函数将在另一个线程(不是UI线程)中执行。因为Windows.UI.Xaml.Shapes.Line
是一个UI元素,是在UI(主)线程中创建的,你不能在另一个线程中访问对象的属性。解决方案是将其转换为没有这些限制的更简单的对象。
此外,Windows.UI.Xaml.Shapes.Line
包含很多信息,可见性,IsEnabled等,我认为您只需要X1, X2, Y1和Y2。所以你可以这样写:
string s = await JsonConvert.SerializeObjectAsync(lines
.Select(l => new
{
l.X1,
l.X2,
l.Y1,
l.Y2
}).ToArray());
通过这种方式,您可以在UI(主)线程中获得所需的属性。然后将该数组传递给序列化函数。
string s
现在包含:
[{"X2"X1":20.0:20.0,"日元":40.0,"日元":40.0},{"X2"X1":20.0:20.0,"日元":40.0,"日元":40.0},{"X2"X1":20.0:20.0,"日元":40.0,"日元":40.0},{"X2"X1":20.0:20.0,"日元":40.0,"日元":40.0}]
我不确定Json是否。Net允许序列化框架类对象。我试过了。
public class CustomLine
{
public double X1 { get; set; }
public double X2 { get; set; }
public double Y1 { get; set; }
public double Y2 { get; set; }
}
我将Line
改为CustomLine
行。如果你想使用Line
类,然后检索属性X1, X2, Y1, Y2
,然后将其分配给CustomLine
类属性。