当前位置: 首页 > news >正文

微信号注册官方网站知名外贸网站建设公司

微信号注册官方网站,知名外贸网站建设公司,移动wap站点,学习网站建设的书籍目录 序列化保存C# 代码示例, 方式1 :C# 代码示例, 方式2 : 反序列化加载C# 代码示例, 方式1:C# 代码示例, 方式2: **如何序列化自定义属性**序列化和反序列化都存在的一个问题解决方式 图表是否已修改&…

目录

  • 序列化
    • 保存
      • C# 代码示例, 方式1 :
      • C# 代码示例, 方式2 :
  • 反序列化
    • 加载
      • C# 代码示例, 方式1:
      • C# 代码示例, 方式2:
    • **如何序列化自定义属性**
    • 序列化和反序列化都存在的一个问题
      • 解决方式
  • 图表是否已修改?
  • 如何在新版本中加载SfDiagram的旧版本

序列化

序列化是将SfDiagram对象的状态转换为字节流的过程,以便在需要时重新创建它们。这样的流可以存储在数据库中、作为文件或内存中。相反的过程称为反序列化。

保存

在SfDiagram中,使用DataContractSerializer进行序列化。DataContractSerializer的功能适用于SfDiagram序列化。它支持将SfDiagram保存到流中。SfDiagram会连同其所有属性一起被保存。

C# 代码示例, 方式1 :

// 将文件保存为流
SaveFileDialog dialog = new SaveFileDialog();
dialog.Title = "保存XAML";
dialog.Filter = "XAML文件(*.xaml)|*.xaml";
if (dialog.ShowDialog() == true)
{using (Stream str = File.Open(dialog.FileName, FileMode.CreateNew)){sfDiagram.Save(str);}
}

C# 代码示例, 方式2 :

  // 将保存为内存流(FileMode.Create 会覆盖已有的,FileMode.CreateNew 不会覆盖已有的)using (Stream str = File.Open(GlobalData.Instance.WfFullName, FileMode.Create)){diagram.Save(str);}

反序列化

加载

在反序列化过程中,使用保存的流来加载当前视图中的SfDiagram节点和连接器。通过这种方式,你可以通过加载适当的流继续处理之前保存的SfDiagram。

C# 代码示例, 方式1:

// 从保存的XAML文件中加载
OpenFileDialog dialog = new OpenFileDialog();
if (dialog.ShowDialog() == true)
{using (Stream myStream = dialog.OpenFile()){sfDiagram.Load(myStream);}
}

C# 代码示例, 方式2:

// 从保存的内存流中加载
using (FileStream fileStream = new FileStream(FullName, FileMode.Open, FileAccess.Read))
{diagram.Load(fileStream);
}

如何序列化自定义属性

在SfDiagram中,你不能序列化每个图表对象的Content和ContentTemplate。如果你想保留图表对象的ContentTemplate,请将它们保存在资源中,并在图表对象添加到图表页面后应用它们。

自定义类中的自定义属性,如果从SfDiagram的任何接口或任何视图模型类派生,则可以通过DataMember属性进行序列化。

C# 代码示例:

public class NodeContent : INode
{[DataMember]public string NodeType{get;set;}
}

也就是说,只要你添加了[DataMember]特性,你自己添加的属性也会被序列化!
但前提是,你的这个类是从SfDiagram的接口或任何视图模型类派生的

注意

SfDiagram的接口和视图模型类是在没有DataContract属性的情况下创建的。因此,对于从这些类派生的类,你不需要添加DataContract属性。

如何序列化自定义类

您可以借助 DataContract 属性和 SfDiagram 的 KnownTypes 属性来序列化业务类。您必须添加 DataContract 属性来序列化整个类。

(再说一次人话): 在进行序列化操作时,如果你有一个业务类(business class),并且这个类没有从任何已经标记了DataContract属性的基类(base class)继承,那么你需要给这个类添加DataContract属性来序列化整个类。简而言之,如果一个类没有继承自一个已经定义了DataContract属性的基类,那么你需要为这个类本身添加DataContract属性,以便能够对其进行序列化。

C# 代码示例:

[DataContract]
public class NodeContent
{[DataMember]public string NodeType{get;set;}
}Diagram.KnownTypes = () => new List<Type>()
{typeof(NodeContent)
};

序列化和反序列化都存在的一个问题

我自己定义一个继承自SfDiagram的接口和视图模型类的类

public class VisualNode : BpmnNodeViewModel
{[DataMember]public string? IDString { get; set; } = null;/// <summary>/// 为view窗口名称,用于打开对于节点窗口!/// </summary>[DataMember]public string NodeViewType { get; set; } = "Activity";/// <summary>/// 工作流节点类型/// </summary>[DataMember]public string StepType { get; set; } = "";/// <summary>/// 记录输入参数(为了方便Diagram自带的序列化可以进行,这里需要改为string类型)/// </summary>[DataMember]public JObject Inputs { get; set; } = null;/// <summary>/// 记录输出参数(为了方便Diagram自带的序列化可以进行,这里需要改为string类型)/// </summary>[DataMember]public JObject Outputs { get; set; } = null;
}

在C#中使用序列化时,如果遇到System.Runtime.Serialization.InvalidDataContractException错误,特别是涉及到Newtonsoft.Json.Linq.JToken类型时,通常是因为JToken类型是一个递归集合数据,这在序列化过程中不被支持。错误信息提示:“Type ‘Newtonsoft.Json.Linq.JToken’ is a recursive collection data contract which is not supported. Consider modifying the definition of collection ‘Newtonsoft.Json.Linq.JToken’ to remove references to itself.”。

JToken(包括JObjectJArray)由于其设计为可以包含自身类型的实例(例如,一个JObject可以包含另一个JObject作为其属性值),导致了递归定义,这在数据契约序列化中是不被允许的。

解决方式

将他们改成string 格式!

   /// </summary>[DataMember]public string Inputs { get; set; } = "{}";/// <summary>/// 记录输出参数(为了方便Diagram自带的序列化可以进行,这里需要改为string类型)/// </summary>[DataMember]public string Outputs { get; set; } = "{}";

JObject 存的时候先序列化

node.Outputs = JsonConvert.SerializeObject(obj);

JObject 用的时候,再反序列化即可

jsonStepData.Outputs = JsonConvert.DeserializeObject<JObject>(FirstFuncNode.Outputs);

图表是否已修改?

图表控件的HasChanges属性用于通知图表是否有未保存的更改。该属性跟踪通过交互和公共API所做的所有更改。

XAML 代码示例:

<!-- 初始化图表 -->
<Syncfusion:SfDiagram x:Name="diagram">
</Syncfusion:SfDiagram>
<!-- 初始化保存图表的按钮 -->
<Button x:Name="SaveButton" Content="保存" Click="SaveButton_Click">
</Button>
//Method to promote the save dialouge box when diagram has any unsaved changes.
private void SaveButton_Click(object sender, RoutedEventArgs e)
{if (diagram != null && diagram.HasChanges){MessageBoxResult messageBoxResult = MessageBox.Show("Do you want to save the Diagram?","SfDiagram",MessageBoxButton.YesNo);if (messageBoxResult == MessageBoxResult.Yes){SaveDiagram();}}
}//Method to save the diagram.
private void SaveDiagram()
{SaveFileDialog dialog = new SaveFileDialog();dialog.Title = "Save XAML";dialog.Filter = "XAML File (*.xaml)|*.xaml";if (dialog.ShowDialog() == true){File.Delete(dialog.FileName);using (Stream s = File.Open(dialog.FileName, FileMode.OpenOrCreate)){diagram.Save(s);}}
}

如何在新版本中加载SfDiagram的旧版本

你可以通过升级方法在新版本中加载任何旧版本的SfDiagram流。请参考以下代码示例。

C# 代码示例:

using (Stream myStream = dialog.OpenFile())
{sfDiagram.Upgrade(myStream);sfDiagram.Load(myStream);
}
http://www.yayakq.cn/news/119555/

相关文章:

  • 彩票网站开发制作软件外贸网站源码下载
  • 简述建设一个网站的步骤做网站工作条件
  • 龙岗个性化网站建设价格低昆明铁路局建设工程网站
  • 公司网站后台管理asp系统网站怎么做优化
  • 学校建立网站上市公司网站建设分析评价
  • 国内信息图制作网站太仓网站建设教程
  • 做单页网站怎么选产品建立免费网站的步骤
  • 北京网站设计研究与开发公司云建站步骤
  • 上海网站案例深圳市布尔工业设计有限公司
  • 如何找到网站管理员全网营销的六大优势
  • 上海外贸soho网站建设小型企业oa办公系统
  • 网站推广的方式和管理方法张家港做网站
  • 苏州住房和城乡建设局网站网签wordpress弹出搜索
  • html5网站源码下载用户体验比较好的网站
  • html5企业网站模版wordpress 瀑布流
  • 网站建设选择本地石家庄大型网站设计公司
  • 上海三凯建设管理咨询有限公司网站免费咨询服务合作协议模板
  • php企业网站开发框架app网站开发住房公积金
  • 南京学习做网站福建响应式网站制作
  • gzip网站优化雇人做淘宝网站多少钱
  • 网站建设进度汇报网站开发产品规划要求
  • 上海品牌建站深圳动漫制作
  • 南京江宁做网站合肥网站建设佳蓝网络
  • 公司做自己的网站平台台网站备案期间
  • 中国万网是做什么的随州网络优化网站建设公司
  • 自建网站如何赚钱怎么用wordpress建立自己的网站
  • 佳木斯做网站的公司全包圆装修公司
  • 成都企业建站系统百度旗下产品
  • 仿团购网站模板任县网站建设
  • 网站提交网址wordpress里面的rss订阅