Сериализация XML C# массива - Пропуск “пустые” строковые значения

Количество (*) считает все записи, включая пустые указатели, тогда как количество (имя поля) не включает, аннулирует.

6
задан Cheeso 18 August 2009 в 04:02
поделиться

2 ответа

Вы уверены, что это то, что вам нужно? Один из недостатков состоит в том, что при десериализации вы не сможете вернуть пустые строки, поскольку десериализатор не может узнать о них. Обычно, когда вы десериализуете, вы хотите получить обратно экземпляр, который выглядит точно так же, как тот, который вы изначально сериализовали.

Если это - это то, что вы хотите, то вам нужно настроить свой объект в соответствии с процессом сериализации . Как предлагает Чизо, суррогатное свойство - хорошее решение для этого.

Кроме того, для ясности, правильно ли я могу сказать, что у вас есть объект ArrayElements , который имеет свойство Items , который представляет собой массив строки s?

2
ответ дан 10 December 2019 в 00:42
поделиться

Вы можете сделать это с помощью суррогатной собственности.

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);
            }
        }
    }
}
8
ответ дан 10 December 2019 в 00:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: