0

我正在开发一个项目,该项目几乎需要一个 xml 文件并在 C# 中对其进行序列化,以便它可以用于格式化 word 文档。到目前为止一切都很顺利,它解析了几千个 xml 标签,到目前为止创建了一个 86 页的 docco 非常愉快。

但是,我在文档完成之前需要完成的最后两个标签上,并且由于某种原因,序列化只是不适用于其中一个。

- <layout_row>
   - <layout_cell type="attribute">
        <attribute_and_presentation attribute="Name" /> 
        <layout_group is_column="true" label_column_width="100" /> 
     </layout_cell>
  </layout_row>

以上是我正在序列化的 xml 代码示例

using System.Collections;
using System.Xml.Serialization;
using System.Xml.Xsl;
using System.Xml.Schema;
using System.Runtime.Serialization;
using System.Collections.Generic;

[System.Serializable()]
public class layout_cell
{
    [XmlAttribute("type")]
    public string type;

    [XmlElement("attribute_and_presentation")]
    public attribute_and_presentation attribute_and_presentation;

    [XmlElement("layout_group")]
    public layout_group layout_group;
}

[System.Serializable()] 
public class attribute_and_presentation { 
    [XmlAttribute] 
    public string attribute; 
} 
[System.Serializable()] 
public class layout_group { 
    [XmlAttribute("is_column")] 
    public string is_column; 

    [XmlAttribute("label_column_width")] 
    public string label_column_width; 
}

问题出在 layout_group 上,由于某种原因,它根本不会序列化。我已经在这几个小时了,我觉得我一定错过了一些非常明显的东西,但对于我的生活,我就是无法解决它。

值得注意的是 type 和 attribute_and_presentation 在此类中都可以完美地序列化。

4

1 回答 1

1

您说需要一个 xml 文件并将其序列化,但我假设您的意思是反序列化。无论如何,这是一个使用您发布的课程的双向工作示例。

虽然我同意您应该使用属性的其他评论,但我不认为这是您的问题。我的示例使用字段(主要是您自己的代码)。事实上,文档说明它可以:

可序列化的项目

  • 公共类的公共读/写属性和字段。

例子:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        static string xml_to_deserialize = @"
    <layout_cell type=""attribute"">
        <attribute_and_presentation attribute=""Name"" /> 
        <layout_group is_column=""true"" label_column_width=""100"" /> 
    </layout_cell>
";

        static void Main(string[] args)
        {
            var serializer = new System.Xml.Serialization.XmlSerializer(typeof(layout_cell));

            //test desieralization
            using (var stringReader = new StringReader(xml_to_deserialize))
            using (var reader = System.Xml.XmlReader.Create(stringReader))
            {
                var result = serializer.Deserialize(reader);

                result.ToString(); //breakpoint here to examimne
            }


            //test serialization

            var toSerialize = new layout_cell()
            {
                type = "some type",
                attribute_and_presentation = new attribute_and_presentation()
                {
                    attribute = "some attribute"
                },
                layout_group = new layout_group()
                {
                    is_column = "true",
                    label_column_width = "100"
                }
            };

            using (var writer = new System.IO.StringWriter())
            {
                serializer.Serialize(writer, toSerialize);

                Console.WriteLine(writer.ToString());
            }


            Console.WriteLine("done, hit enter.");
            Console.ReadLine();

        }
    }

    [System.Serializable()]
    public class layout_cell
    {
        [XmlAttribute("type")]
        public string type;

        [XmlElement("attribute_and_presentation")]
        public attribute_and_presentation attribute_and_presentation;

        [XmlElement("layout_group")]
        public layout_group layout_group;
    }

    [System.Serializable()] public class attribute_and_presentation
    {
        [XmlAttribute]
        public string attribute;
    }

    [System.Serializable()] public class layout_group
    {
        [XmlAttribute("is_column")] public string is_column;
        [XmlAttribute("label_column_width")] public string label_column_width;
    }
}
于 2013-08-15T00:02:01.903 回答