C# 在WPF应用程序中使用NewtonSoft序列化模型

C# 在WPF应用程序中使用NewtonSoft序列化模型,c#,wpf,serialization,thread-safety,C#,Wpf,Serialization,Thread Safety,我试图每秒序列化我的模型并将其推送到服务器。我设置了一个周期性任务,每秒钟执行一次。我调用SendNewMessage来执行推送。 从构造函数调用SendNewMessage()的第一个方法调用运行良好,没有异常或问题 当异步任务尝试调用SendNewMessage时,我得到一个异常,应用程序关闭。这是NewtonSoft代码: String PushModelToServer=JsonConvert.SerializeObject(这是jss)哪个失败了 托管调试助手“FatalExecuti

我试图每秒序列化我的模型并将其推送到服务器。我设置了一个周期性任务,每秒钟执行一次。我调用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的用户封送错误,这可能会损坏堆栈

根据要求提供更多信息:
构造函数中第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;
    }
    ...