以上就是给各位分享Color结构的最优雅的XML序列化,其中也会对colors.xml的作用进行解释,同时本文还将给你拓展.net–包含无效字符的对象的XML序列化、.net–多态XML序列化/反序列
以上就是给各位分享Color结构的最优雅的XML序列化,其中也会对colors.xml的作用进行解释,同时本文还将给你拓展.net – 包含无效字符的对象的XML序列化、.net – 多态XML序列化/反序列化、.net – 没有处置的Xml序列化、2021-3-9 xml序列化和反序列化等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:- Color结构的最优雅的XML序列化(colors.xml的作用)
- .net – 包含无效字符的对象的XML序列化
- .net – 多态XML序列化/反序列化
- .net – 没有处置的Xml序列化
- 2021-3-9 xml序列化和反序列化
Color结构的最优雅的XML序列化(colors.xml的作用)
一个问题困扰着我,足以在Stack
Overflow上注册。当前,如果我想将Color序列化为XML字符串,命名为color或#rrggbb
或#aarrggbb
,则可以这样做:
[XmlIgnore()]public Color color;[XmlElement(ElementName = "Color")]public String color_XmlSurrogate{ get { return MyColorConverter.SetColor(color); } set { color = MyColorConverter.GetColor(value); }}
这MyColorConverter
就是我喜欢的方式进行序列化。但是,所有这些都感觉像是在与其他领域和所有事物融合在一起。有没有一种方法可以使它以更少的行数运行,也许将TypeDescriptor与与XML相关的C#属性连接起来?
答案1
小编典典这是我用于序列化Color
XML中的结构的一些东西。Color
在我看来,这比遮盖主要财产更好。任何建议欢迎。
该XmlColor
班主要依赖implicitoperator
语言功能来提供关键数据tranformations。没有这个,该类基本上是无用的。添加了其他功能来完善该类。
该XmlColor
助手还提供了一个方便的方式来单独颜色分量。我添加了Alpha
属性来显示这一点。请注意,Alpha
如果将组件一直弯曲到255,则不会对其进行序列化。
反序列化Web
颜色值将合并Alpha
当前存储在实例中的值。属性的解析顺序无关紧要。如果Alpha
XML源中缺少该属性,那么将使用实例组件值来设置Alpha
级别。可以说这是有缺陷的。但是,对于XML序列化,XmlColor
该类将通过Color.Black
将设置Alpha
为255进行初始化。
我正在VS2010环境中工作,并针对.Net 4进行构建。我不知道该代码与先前版本的兼容性如何。
这是一个应序列化为XML的示例属性:
[XmlElement(Type=typeof(XmlColor))] public Color MyColor { get; set; }
这是XmlColor
帮助程序类:
public class XmlColor{ private Color color_ = Color.Black; public XmlColor() {} public XmlColor(Color c) { color_ = c; } public Color ToColor() { return color_; } public void FromColor(Color c) { color_ = c; } public static implicit operator Color(XmlColor x) { return x.ToColor(); } public static implicit operator XmlColor(Color c) { return new XmlColor(c); } [XmlAttribute] public string Web { get { return ColorTranslator.ToHtml(color_); } set { try { if (Alpha == 0xFF) // preserve named color value if possible color_ = ColorTranslator.FromHtml(value); else color_ = Color.FromArgb(Alpha, ColorTranslator.FromHtml(value)); } catch(Exception) { color_ = Color.Black; } } } [XmlAttribute] public byte Alpha { get { return color_.A; } set { if (value != color_.A) // avoid hammering named color if no alpha change color_ = Color.FromArgb(value, color_); } } public bool ShouldSerializeAlpha() { return Alpha < 0xFF; }}
.net – 包含无效字符的对象的XML序列化
Dim Formatter As New Xml.Serialization.XmlSerializer(GetType(MyObject)) Dim fs As New FileStream(FilePath,FileMode.Create) Formatter.Serialize(fs,Ob) fs.Close()
但是当我将XML读回Object时:
Dim Formatter As New Xml.Serialization.XmlSerializer(GetType(MyObject)) Dim fs As New FileStream(FilePath,FileMode.Open) Dim Ob = CType(Formatter.Deserialize(fs),MyObject) fs.Close()
我收到此错误:
"'''',hexadecimal value 0x14,is an invalid character. Line 395,position 22."
.NET不应该阻止这种错误,转义无效字符吗?
这里发生了什么,我该如何解决?
解决方法
0x14
is an invalid value for XML.没有办法逃避它,甚至没有使用,因为它被排除在XML模型中作为有效字符.我真的很惊讶串行器允许这样做,因为它使串行器不合格.
您是否可以在序列化之前从字符串中删除无效字符?出于什么目的,您在HTML中有0x14?
或者,您是否可能使用一种编码进行编写,并使用另一种编码进行阅读?
.net – 多态XML序列化/反序列化
public class B { public string Some { get; set; } } public class D : B { public string More { get; set; } } [KNownType(typeof(D))] public class X { public B[] Col { get; set; } }
我想自动读/写XML,如下所示:
<X> <Col> <B Some="val1" /> <D Some="val2" More="val3" /> </Col> </X>
XmlSerializer和DataContractSerializer都没有帮助我.此XML结构是必需的.
所以问题是:这可以实现,还是我必须手动解析XML?
谢谢,
安德烈
解决方法
public class X { [XmlArrayItem(typeof(D)),XmlArrayItem(typeof(B))] public B[] Col { get; set; } }
.net – 没有处置的Xml序列化
using (var file_stream = File.Create("users.xml")) { var serializer = new XmlSerializer(typeof(PasswordManager)); serializer.Serialize(file_stream,this); file_stream.Close(); }
使用上面的代码非常有效.但是,当我把它缩短为:
var serializer = new XmlSerializer(typeof(PasswordManager)); serializer.Serialize(File.Create("users.xml"),this);
当我尝试在同一测试中反序列化users.xml文件时,我收到以下异常:
该进程无法访问文件’users.xml’,因为它正被另一个进程使用.
原因似乎是File.Create方法返回一个打开的FileStream,我无法关闭,因为我没有保留它的引用.
我的坏,还是微软的?
总结
以上是小编为你收集整理的.net – 没有处置的Xml序列化全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
2021-3-9 xml序列化和反序列化
class XmlHelp { #region 调用 /// <summary> /// xml添加 /// </summary> /// <param name="filename"></param> /// <param name="people"></param> public void XmlAdd(string filename, List<People> pList) { try { List<People> peoples = XmlDeSerializer(filename); foreach (var item in pList) { People people = new People(); people.Name = string.IsNullOrEmpty(item.Name) ? "" : item.Name; people.Id = string.IsNullOrEmpty(item.Id) ? "" : item.Id; people.Age = string.IsNullOrEmpty(item.Age) ? "" : item.Age; people.Sex = string.IsNullOrEmpty(item.Sex) ? "" : item.Sex; peoples.Add(people); } XmlSerializer x = new XmlSerializer(typeof(List<People>)); TextWriter writer = new StreamWriter(filename); x.Serialize(writer, peoples); writer.dispose(); } catch (Exception ex) { } } /// <summary> /// xml编辑 /// </summary> /// <param name="filename"></param> /// <param name="people"></param> public void XmlEdit(string filename, List<People> pList, int index) { try { XmlDelete("User", index); List<People> peoples = XmlDeSerializer(filename); foreach (var item in pList) { People people = new People(); people.Name = string.IsNullOrEmpty(item.Name) ? "" : item.Name; people.Id = string.IsNullOrEmpty(item.Id) ? "" : item.Id; people.Age = string.IsNullOrEmpty(item.Age) ? "" : item.Age; people.Sex = string.IsNullOrEmpty(item.Sex) ? "" : item.Sex; peoples.Insert(index, people); } XmlSerializer x = new XmlSerializer(typeof(List<People>)); TextWriter writer = new StreamWriter(filename); x.Serialize(writer, peoples); writer.dispose(); } catch (Exception ex) { } } /// <summary> /// 删除列表 /// </summary> /// <param name="filename"></param> /// <param name="pList"></param> public void XmlDelete(string filename, int index = 0) { try { List<People> peoples = XmlDeSerializer(filename); peoples.RemoveAt(index); XmlSerializer x = new XmlSerializer(typeof(List<People>)); TextWriter writer = new StreamWriter(filename); x.Serialize(writer, peoples); writer.dispose(); } catch (Exception ex) { } } /// <summary> /// 显示列表 /// </summary> /// <param name="filename"></param> /// <param name="pList"></param> public List<People> XmlDeSerializer(string filename) { try { var mySerializer = new XmlSerializer(typeof(List<People>)); var myFileStream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); if (myFileStream.Length > 0) { var myObject = (List<People>)mySerializer.Deserialize(myFileStream); return myObject; } myFileStream.dispose(); return new List<People>(); } catch (Exception ex) { return new List<People>(); } }#endregion }
可以创建一个类直接复制上方的代码,然后将people换成一个新类,并将people中的成员替换
XmlHelp xmlHelp = new XmlHelp(); private void InfoListView_SelectedindexChanged(object sender, EventArgs e) { if (InfoListView.SelectedItems.Count > 0) { this.NameTxt.Text = InfoListView.SelectedItems[0].SubItems[0].Text; this.SexTxt.Text = InfoListView.SelectedItems[0].SubItems[1].Text; this.AgeTxt.Text = InfoListView.SelectedItems[0].SubItems[2].Text; this.IdTxt.Text = InfoListView.SelectedItems[0].SubItems[3].Text; } } private void DeleteBtn_Click(object sender, EventArgs e) { try { if (InfoListView.SelectedItems.Count > 0) { var index = InfoListView.SelectedItems[0].Index; xmlHelp.XmlDelete("User", index); ListLoad(); TextClear(); MessageBox.Show("删除成功"); } else { MessageBox.Show("请选择想要删除的数据"); } } catch { MessageBox.Show("出现错误"); } } private void UpdateBtn_Click(object sender, EventArgs e) { try { if (InfoListView.SelectedItems.Count > 0) { var index = InfoListView.SelectedItems[0].Index; People people = new People(); people.Name = NameTxt.Text; people.Id = IdTxt.Text; people.Age = AgeTxt.Text; people.Sex = SexTxt.Text; var peoples = new List<People>(); peoples.Add(people); xmlHelp.XmlEdit("User", peoples, index); ListLoad(); TextClear(); MessageBox.Show("更新成功"); } else { MessageBox.Show("请选择想要修改的数据"); } } catch { MessageBox.Show("出现错误"); } } private void AddBtn_Click(object sender, EventArgs e) { try { People people = new People(); people.Name = NameTxt.Text; people.Id = IdTxt.Text; people.Age = AgeTxt.Text; people.Sex = SexTxt.Text; var peoples = new List<People>(); peoples.Add(people); xmlHelp.XmlAdd("User", peoples); ListLoad(); TextClear(); MessageBox.Show("添加成功"); } catch { MessageBox.Show("出现错误"); } } private void XMLFrm_Load(object sender, EventArgs e) { ListLoad(); } public void ListLoad() { try { this.InfoListView.Clear(); var pList = xmlHelp.XmlDeSerializer("User"); this.InfoListView.View = View.Details; this.InfoListView.Columns.Add("编号", 100, HorizontalAlignment.Left); this.InfoListView.Columns.Add("姓名", 100, HorizontalAlignment.Left); this.InfoListView.Columns.Add("性别", 100, HorizontalAlignment.Left); this.InfoListView.Columns.Add("年龄", 100, HorizontalAlignment.Left); foreach (var item in pList) { ListViewItem lvi = new ListViewItem(item.Id); lvi.SubItems.Add(item.Name); lvi.SubItems.Add(item.Sex); lvi.SubItems.Add(item.Age); this.InfoListView.Items.Add(lvi); } } catch { MessageBox.Show("出现错误"); } } void TextClear() { this.NameTxt.Text = ""; this.SexTxt.Text = ""; this.AgeTxt.Text = ""; this.IdTxt.Text = ""; }
窗体的cs中的内容,分别是删除,修改,添加,加载在表格和清除text中的内容。
关于Color结构的最优雅的XML序列化和colors.xml的作用的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于.net – 包含无效字符的对象的XML序列化、.net – 多态XML序列化/反序列化、.net – 没有处置的Xml序列化、2021-3-9 xml序列化和反序列化的相关知识,请在本站寻找。
本文标签: