0

我在序列化 ObservableCollection of Lines (Shape) 时遇到了一些麻烦。我正在为 Windows RT 开发,我正在使用 JSON.NET v5.02。我收到以下代码的以下异常:

ObservableCollection<Line> lines;
//some code
string linesString = JsonConvert.SerializeObjectAsync(lines); // problem

mscorlib.dll 中发生类型异常,Newtonsoft.Json.JsonSerializationException 但未在用户代码中处理

附加信息:从“Windows.UI.Xaml.Shapes.Line”上的“X1”获取值时出错。

如果有这个异常的处理程序,程序可以安全地继续。

这是一个错误,是否有可能的解决方法?

4

2 回答 2

2

你的问题是跨线程问题。使用await JsonConvert.SerializeObjectAsync(lines);该函数时将在另一个线程(不是 UI 线程)中执行。由于 aWindows.UI.Xaml.Shapes.Line是 UIElement 并且是在 UI(主)线程中创建的,因此您无法在另一个线程中访问对象的属性。解决方案是将其转换为没有此限制的更简单的对象。

此外,aWindows.UI.Xaml.Shapes.Line包含很多信息,Visibility,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现在将包含:

[{"X1":20.0,"X2":20.0,"Y1":40.0,"Y2":40.0},{"X1":20.0,"X2":20.0,"Y1":40.0,"Y2": 40.0},{"X1":20.0,"X2":20.0,"Y1":40.0,"Y2":40.0},{"X1":20.0,"X2":20.0,"Y1":40.0,"Y2 ":40.0}]

于 2013-04-11T09:29:36.997 回答
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; }
}

我更改了LinetoCustomLine行。如果要使用Line类,请检索属性X1, X2, Y1, Y2,然后将其分配给CustomLine类属性。

于 2013-04-11T09:27:27.190 回答