2016-03-06 44 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

相关问题