Количество (*) считает все записи, включая пустые указатели, тогда как количество (имя поля) не включает, аннулирует.
Вы уверены, что это то, что вам нужно? Один из недостатков состоит в том, что при десериализации вы не сможете вернуть пустые строки, поскольку десериализатор не может узнать о них. Обычно, когда вы десериализуете, вы хотите получить обратно экземпляр, который выглядит точно так же, как тот, который вы изначально сериализовали.
Если это - это то, что вы хотите, то вам нужно настроить свой объект в соответствии с процессом сериализации . Как предлагает Чизо, суррогатное свойство - хорошее решение для этого.
Кроме того, для ясности, правильно ли я могу сказать, что у вас есть объект ArrayElements
, который имеет свойство Items
, который представляет собой массив строки
s?
Вы можете сделать это с помощью суррогатной собственности.
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);
}
}
}
}