C# 在WPF应用程序中使用NewtonSoft序列化模型
我试图每秒序列化我的模型并将其推送到服务器。我设置了一个周期性任务,每秒钟执行一次。我调用SendNewMessage来执行推送。 从构造函数调用SendNewMessage()的第一个方法调用运行良好,没有异常或问题 当异步任务尝试调用SendNewMessage时,我得到一个异常,应用程序关闭。这是NewtonSoft代码: String PushModelToServer=JsonConvert.SerializeObject(这是jss)哪个失败了 托管调试助手“FatalExecutionEngineError”在中检测到问题 'C:\Users\snovva\Source\workspace\HMI\HMI.ViSoft\bin\x86\Debug\HMI.ViSoft.vshost.exe'。 其他信息:运行时遇到致命错误。错误地址位于线程0x2788上的0x71041771。错误代码为0xc0000005。此错误可能是CLR或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM互操作或PInvoke的用户封送错误,这可能会损坏堆栈 根据要求提供更多信息:C# 在WPF应用程序中使用NewtonSoft序列化模型,c#,wpf,serialization,thread-safety,C#,Wpf,Serialization,Thread Safety,我试图每秒序列化我的模型并将其推送到服务器。我设置了一个周期性任务,每秒钟执行一次。我调用SendNewMessage来执行推送。 从构造函数调用SendNewMessage()的第一个方法调用运行良好,没有异常或问题 当异步任务尝试调用SendNewMessage时,我得到一个异常,应用程序关闭。这是NewtonSoft代码: String PushModelToServer=JsonConvert.SerializeObject(这是jss)哪个失败了 托管调试助手“FatalExecuti
构造函数中第10行的调用将运行。序列化第一次起作用。由于模型中的数据正在更改,我每秒都在推这个模型以更新服务器。失败的是异步调用。随着时间的推移,模型中的数据将发生变化。那么,您试图序列化的类中一定有某种东西使序列化程序变得疯狂。也许你不应该序列化“this”,而应该试着序列化一个实际的“DataObject”——它可以被序列化,并且不包含对计时器、任务等的引用 您可以使用
[IgnoreDataMember]
来避免序列化不应包含的属性
下面的代码适用于我的应用程序,希望能帮助您找到应用程序的解决方案
<>我希望你上面显示的代码是你真正代码的一个片段,因为在1秒计时器、重新入侵者等方面存在一些潜在的问题,而不是在模型构造函数中做这个计时器,考虑把它移到另一个函数/类,并设置一个额外的调用的定时器/调用。只是一些关于达成一个好模式的建议。在这里做更多的研究
以下是我获取数据的方式,您希望在推送模型服务器中获得什么:
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;
}
}
公共类backupdatea
{
公共列表车辆{get;private set;}
公共列表{get;private set;}
公共后台更新a(列出车辆、加油站列表)
{
车辆=车辆;
燃料停止=燃料停止;
}
公共字符串ToJson(格式化=格式化.None)
{
var json=JsonConvert.SerializeObject(这是一种格式);
返回json;
}
来自JSON的公共静态backupdatea(字符串JSONbackupdatea)
{
var data=JsonConvert.DeserializeObject(jsonBackUpdatea);
返回数据;
}
}
以下是我的一个类的片段:
[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; }
....
[DebuggerDisplay(“{VehicleName}”)]
公共级车辆:i可比较,i未改变特性
{
私有字符串id;
公共字符串Id
{
获取{return id;}
设置
{
如果(id!=value){id=value;NotifyPropertyChanged();}
}
}
私有字符串车辆名称;
公共字符串车辆名称
{
获取{return vehicleName;}
设置
{
如果(vehicleName!=value){vehicleName=value;NotifyPropertyChanged();}
}
}
公共重写字符串ToString()
{
返回车辆名称;
}
[IgnoreDataMember]
公共更新属性更新属性{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;
}
...
#如果是WINDOWS手机应用程序
私有void OnExecuteBackup(设置SPAGE obj)
{
#否则
专用异步任务OnExecuteBackup(设置SPAGE obj)
{
#恩迪夫
var backupdatea=App.JournalModel.getbackupdatea().ToJson(Formatting.Indented);
...
等待SaveBackupFile(文件,backupdatea);
...
公共类日志模型
{
...
public backupdatea getbackupdatea()
{
var data=新的backupdatea(Vehicles.ToList(),FuelStops.ToList());
返回数据;
}
...
祝你的项目好运。你试图序列化的类中一定有什么东西让序列化程序发疯了。我相信OP说了这个电话(在第10行)有效,但lambda中第7行的调用无效。如果使用正确的属性装饰该类,它应该可以正常工作。也许OP可以通过注释澄清示例以显示哪个调用有效,或者可以用更多细节展开问题。@KoryGill您是对的。我应该“装饰”哪些属性我以前没有这样做过。我只想要基本上是字符串、浮点数和布尔基类型的公共属性。是的,这是可能的。但这需要一些工作。我在一些复杂对象上使用了参数:[JsonIgnore],现在它工作得很好:)
#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;
}
...