use*_*584 6 .net c# xml-serialization
我想在C#中的xml序列化期间跳过XML文件中的空元素创建.
例如:
ArrayElements elm = new ArrayElements
{ Items =new string[] "Item1", " ", "Item2", " ", " ", "Items" } };
Run Code Online (Sandbox Code Playgroud)
在序列化期间,它应该跳过空字符串.
这是我的班级:
[Serializable]
public class ArrayElements
{
[XmlElement(IsNullable=false)]
public string[] Items { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
你可以用代理财产来做.
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您确定这是您想要的吗?一个缺点是,当您反序列化时,您将无法取回空字符串,因为反序列化器无法了解它们。通常,当您反序列化时,您希望返回一个与最初序列化的实例完全相同的实例。
如果这就是您想要的,那么您必须调整对象以适应序列化过程。正如 Cheeso 所建议的,替代财产是一个很好的解决方案。
另外,为了清楚起见,我是否正确地说你有一个ArrayElements具有 property 的对象Items,它是 s 的数组string?
| 归档时间: |
|
| 查看次数: |
4874 次 |
| 最近记录: |