C#数组的XML序列化 - 跳过“空”字符串值

6
我希望在C#的XML序列化过程中跳过XML文件中空元素的创建。
例如:
ArrayElements elm = new ArrayElements 
{ Items =new string[]  "Item1", " ", "Item2", " ", " ", "Items" } };

在序列化期间,应跳过空字符串。

这是我的类:

[Serializable]
public class ArrayElements
{
    [XmlElement(IsNullable=false)]
    public string[] Items { get; set; }
}

请添加标签并修改问题,以包括语言、框架等。提供足够的信息有助于他人帮助您。 - shahkalpesh
2个回答

8
你可以使用替代属性来完成它。
namespace Cheeso.Xml.Samples.Arrays
{
    static class Extensions
    {
        private static XmlSerializerNamespaces _ns;

        static Extensions()
        {
            // to suppress unused default namespace entries in the root elt
            _ns = new XmlSerializerNamespaces();
            _ns.Add( "", "" );
        }

        public static string SerializeToString(this XmlSerializer s, object o)
        {
            var builder = new System.Text.StringBuilder();
            var settings = new System.Xml.XmlWriterSettings { OmitXmlDeclaration = true, Indent= true };

            using ( var writer = System.Xml.XmlWriter.Create(builder, settings))
            {
                s.Serialize(writer, o, _ns);
            }
            return builder.ToString();
        }
    }

    [XmlType("ArrayOfString")]
    public class MyContainer
    {
        [XmlIgnore]
        public String[] a;

        // surrogate property
        [XmlElement("string")]
        public String[] A
        {
            get
            {
                List<String> _proxy = new List<String>();
                foreach (var s in a)
                {
                    if (!String.IsNullOrEmpty(s))
                        _proxy.Add(s);
                }
                return _proxy.ToArray();
            }
            set
            {
                a = value;
            }
        }
    }

    class StringArrayOnlyNonEmptyItems
    {
        static void Main(string[] args)
        {
            try 
            {
                Console.WriteLine("\nRegular Serialization of an array of strings with some empty elements:");
                String[] x = { "AAA", "BBB",  "",  "DDD",  "", "FFF" };
                XmlSerializer s1 = new XmlSerializer(typeof(String[]));
                string s = s1.SerializeToString(x);
                Console.WriteLine(s);

                Console.WriteLine("\nSerialization of an array of strings with some empty elements, via a Container:");
                MyContainer c = new MyContainer();
                c.a = x;
                XmlSerializer s2 = new XmlSerializer(typeof(MyContainer));
                s = s2.SerializeToString(c);
                Console.WriteLine(s);
            }
            catch (System.Exception exc1)
            {
                Console.WriteLine("uncaught exception:\n{0}", exc1);
            }
        }
    }
}

2
你确定这就是你想要的吗?一个缺点是,当你反序列化时,你将无法获得空字符串,因为反序列化程序无法知道它们的存在。通常情况下,当你反序列化时,你希望得到一个与你最初序列化的实例完全相同的实例。
如果这正是你想要的,那么你需要调整你的对象以适应序列化过程。像Cheeso建议的那样,代理属性是一个很好的解决方案。
另外,为了明确起见,我是否正确地说你有一个名为ArrayElements的对象,它具有一个名为Items的属性,该属性是一个string数组?

是的,我有一个对象ArrayElements,它有一个名为Items的属性,这是一个字符串数组。 - user146584

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接