2016-03-06 46 views
1

我想每秒序列化我的模型並將其推送到服務器。我已經設置了每秒執行一次的定期任務。我調用SendNewMessage來執行推送。 從構造函數調用的第一個方法調用SendNewMessage()運行良好,沒有任何例外或問題。在WPF應用程序中使用NewtonSoft序列化模型

當異步任務嘗試調用SendNewMessage時,出現異常,我的應用程序關閉。它是NewtonSoft代碼:

String PushModelToServer = JsonConvert.SerializeObject(this,jss);從而未能

託管調試助手 'FatalExecutionEngineError' 已檢測到問題的 「C:\用戶\ snovva \來源\工作區\ HMI \ HMI.ViSoft \ BIN \ 86 \調試\ HMI.ViSoft.vshost。可執行程序'。 附加信息:運行時遇到致命錯誤。錯誤的地址是0x71041771,線程0x2788。錯誤代碼是0xc0000005。此錯誤可能是CLR中的錯誤,也可能是用戶代碼中不安全或不可驗證的部分。此錯誤的常見來源包括COM-interop或PInvoke的用戶編組錯誤,這可能會破壞堆棧。

public class Model : ModelBase 
    { 
     public Model() 
     { 
      PeriodicTask.Run(() => 
      { 
       SendNewMessage(); 
      }, 
      TimeSpan.FromSeconds(1)); 
      SendNewMessage(); 
     } 
     public void SendNewMessage() 
     { 
      // Send the message    
      JsonSerializerSettings jss = new JsonSerializerSettings(); 
      jss.Formatting = Newtonsoft.Json.Formatting.Indented; 
      String PushModelToServer = JsonConvert.SerializeObject(this, jss); 
      sendMessage(System.Text.Encoding.Unicode.GetBytes(PushModelToServer)); 

     } 
} 

public class PeriodicTask 
{ 
    public static async Task Run(Action action, TimeSpan period, CancellationToken cancellationToken) 
    { 
     while (!cancellationToken.IsCancellationRequested) 
     { 
      await Task.Delay(period, cancellationToken); 

      if (!cancellationToken.IsCancellationRequested) 
       action(); 
     } 
    } 

    public static Task Run(Action action, TimeSpan period) 
    { 
     return Run(action, period, CancellationToken.None); 
    } 
} 

更多信息按照要求: 構造函數內運行線10的電話。序列化是第一次。由於模型中的數據正在改變,我每秒都會推動這個模型來更新服務器。這是失敗的異步調用。隨着時間的推移,模​​型中的數據將發生變化。

+0

那麼一定要有你想要序列化的類,這會使序列化程序變得瘋狂。 – Marty

+0

我相信OP說這個呼叫(在線10)有效,但是在lambda內線7上的呼叫沒有。如果該類用正確的屬性修飾,它應該可以正常工作。也許OP可以澄清這個例子,以顯示哪個調用與評論一起工作,並且可以用更多細節來擴展該問題。 –

+0

@KoryGill你是對的。我應該「裝飾」哪些屬性?我以前沒有這樣做過。我只想要基本上是字符串,浮動和布爾基本類型的公共屬性。 – Snovva1

回答

1

您可以使用[IgnoreDataMember]來避免序列化不應包含的屬性。

下面的代碼適用於我的應用程序,並且希望能幫助您爲您的應用程序提供解決方案。

我希望你上面顯示的代碼是你的真實代碼的一個片段,因爲有1秒計時器,重新進入等一些潛在的問題。而不是在Model構造函數中做這個計時器,考慮移動它到另一個功能/類,並設置定時器/來自您稍後設置的另一個呼叫...再次,只是一些建議,以達到一個良好的模式。在這裏做更多的研究...

這是我如何得到我的數據,你想在你PushModelToServer什麼:

public class BackupData 
{ 
    public List<Vehicles> Vehicles { get; private set; } 
    public List<FuelStops> FuelStops { get; private set; } 

    public BackupData(List<Vehicles> vehicles, List<FuelStops> fuelStops) 
    { 
     Vehicles = vehicles; 
     FuelStops = fuelStops; 
    } 

    public string ToJson(Formatting formatting = Formatting.None) 
    { 
     var json = JsonConvert.SerializeObject(this, formatting); 
     return json; 
    } 

    public static BackupData FromJson(string jsonBackupData) 
    { 
     var data = JsonConvert.DeserializeObject<BackupData>(jsonBackupData); 
     return data; 
    } 
} 

這是我的一個類的一個片段:

[DebuggerDisplay("{VehicleName}")] 
public class Vehicles : IComparable<Vehicles>, INotifyPropertyChanged 
{ 
    private string id; 
    public string Id 
    { 
     get { return id; } 
     set 
     { 
      if (id != value) { id = value; NotifyPropertyChanged(); } 
     } 
    } 

    private string vehicleName; 
    public string VehicleName 
    { 
     get { return vehicleName; } 
     set 
     { 
      if (vehicleName != value) { vehicleName = value; NotifyPropertyChanged(); } 
     } 
    } 

    public override string ToString() 
    { 
     return VehicleName; 
    } 

    [IgnoreDataMember] 
    public UpdateState UpdateState { get; set; } 
    .... 

這裏是我如何獲取數據,所以我可以用它在任何地方我想:

#if WINDOWS_PHONE_APP 
    private void OnExecuteBackup(SettingsPage obj) 
    { 
#else 
    private async Task<bool> OnExecuteBackup(SettingsPage obj) 
    { 
#endif 
     var backupData = App.JournalModel.GetBackupData().ToJson(Formatting.Indented); 
     ... 
     await SaveBackupFile(file, backupData); 
     ... 


public class JournalModel 
{ 
    ... 
    public BackupData GetBackupData() 
    { 
     var data = new BackupData(Vehicles.ToList(), FuelStops.ToList()); 
     return data; 
    } 
    ... 

祝你p roject。

+0

我在一些複雜的對象上使用了參數:[JsonIgnore] ,現在它工作的很棒! :) – Snovva1

0

那麼一定要有你想要序列化的類,這會使序列化程序變得瘋狂。也許不是序列化'this'你應該嘗試序列化一個實際的'DataObject' - 可以序列化的東西,並且不包含對定時器,任務等的引用。

+0

是的,那是可能的。這需要一些工作。 – Snovva1

相關問題