2013-04-11 84 views
0

我在序列化一个ObservableCollection(形状)时遇到了一些麻烦。我正在开发Windows RT,并使用JSON.NET v5.02。我得到以下异常的代码如下:JSON.NET线序列化winrt

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

Newtonsoft.Json.JsonSerializationException 的异常出现在mscorlib.dll但在用户代码

其他信息没有处理错误:获得价值从'X1' 'Windows.UI.Xaml.Shapes.Line'。

如果有这种异常的处理程序,程序可能会安全地继续执行 。

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

+0

在你的例子中'lines'没有被初始化。 – 2013-04-11 09:05:33

+0

一个示例项目可以在以下链接下载: http://speedy.sh/ByHWx/JsonNetProblem.rar – 2013-04-11 09:12:56

回答

2

你的问题是一个交叉线程问题。当使用await JsonConvert.SerializeObjectAsync(lines);时,该函数将在另一个线程(而不是UI线程)中执行。由于Windows.UI.Xaml.Shapes.Line是UIElement,并且在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现在将包含:

[{ “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}]

+0

如果您不创建状态机,请不要忘记使用'.ToArray()' '.Select'状态机将在需要时执行,即在另一个线程中的SerializeObjectAsync中执行。通过调用'.ToArray()',你可以强制statemachine运行并在UI线程中创建一个数组。 – SynerCoder 2013-04-11 09:41:08

+0

Hi @ SynerCoder我可以使用你的解决方案,我的问题请让我知道在此先感谢... http://stackoverflow.com/questions/17105051/save-information-of-line-and-images – Mohit 2013-06-14 10:05:41

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; } 
} 

我改变了LineCustomLine线。如果要使用Line类,则检索属性X1, X2, Y1, Y2,然后将其分配给CustomLine类属性。