2013-04-11 85 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類屬性。