GVKun编程网logo

Color结构的最优雅的XML序列化(colors.xml的作用)

12

以上就是给各位分享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的作用)

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

小编典典

这是我用于序列化ColorXML中的结构的一些东西。Color在我看来,这比遮盖主要财产更好。任何建议欢迎。

XmlColor班主要依赖implicitoperator语言功能来提供关键数据tranformations。没有这个,该类基本上是无用的。添加了其他功能来完善该类。

XmlColor助手还提供了一个方便的方式来单独颜色分量。我添加了Alpha属性来显示这一点。请注意,Alpha如果将组件一直弯曲到255,则不会对其进行序列化。

反序列化Web颜色值将合并Alpha当前存储在实例中的值。属性的解析顺序无关紧要。如果AlphaXML源中缺少该属性,那么将使用实例组件值来设置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序列化

.net – 包含无效字符的对象的XML序列化

我正在序列化一个包含String属性中的 HTML数据的对象.

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.没有办法逃避它,甚至没有使用&#x14,因为它被排除在XML模型中作为有效字符.我真的很惊讶串行器允许这样做,因为它使串行器不合格.

您是否可以在序列化之前从字符串中删除无效字符?出于什么目的,您在HTML中有0x14?

或者,您是否可能使用一种编码进行编写,并使用另一种编码进行阅读?

.net – 多态XML序列化/反序列化

.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?

谢谢,
安德烈

解决方法

使用XmlSerializer尝试 XmlArrayItem:

public class X
{        
     [XmlArrayItem(typeof(D)),XmlArrayItem(typeof(B))]
     public B[] Col { get; set; }
}

.net – 没有处置的Xml序列化

.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序列化和反序列化

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序列化和反序列化的相关知识,请在本站寻找。

本文标签: