循环引用和自定义字段使用什么序列化程序(到 xml)?
What serializer to use (to xml) for circular reference and custom field?
我有以下 xml:
<A name="">
<B name="">
<C name="">
<B name=""/>
<B name=""/>
</C>
</B>
<B name="">
<C name="">
<B name=""/>
<B name=""/>
<B name=""/>
<B name=""/>
</C>
</B>
</A>
请注意,元素 C 会创建循环引用,因此我无法使用 XmlSerializer。
如何反序列化和序列化它?
看来我不能使用 DataContractSerializer 因为:
- DataContract 不支持属性("Name" 在我的示例中)
DataContract 不支持忽略外部元素名称,例如
List<B> BList;
将序列化为:
<C name="">
<BList>
<B name=""/>
<B name=""/>
</Blist>
</C>
但我也想保持第一个示例中的结构。
非常感谢。
如果您只关心序列化/反序列化,那么您应该使用支持循环的序列化程序,例如 Json.Net. If I am not mistaken binary serializer 也应该可以。
您可以借助 XML 序列化器和反序列化器
实现此目的
Class 结构:
[XmlRoot(ElementName = "A")]
public class A
{
[XmlAttribute("Name")]
public string Name { get; set; }
private List<B> b = new List<B>();
[XmlElement("B")]
public List<B> B
{
get { return b; }
set { b = value; }
}
}
public class B
{
[XmlAttribute("Name")]
public string Name { get; set; }
private List<C> c = new List<C>();
[XmlElement("C")]
public List<C> C
{
get { return c; }
set { c = value; }
}
}
public class C
{
[XmlAttribute("Name")]
public string Name { get; set; }
private List<B> b = new List<B>();
[XmlElement("B")]
public List<B> B
{
get { return b; }
set { b = value; }
}
}
填充对象(根据您的要求更新):
private A a = new A();
private void Load()
{
a.B.Clear();
a.Name = string.Empty;
for (int i = 0; i < 3; i++)
{
var tempB = new B();
tempB.Name = string.Empty;
for (int j = 0; j < 5; j++)
{
var tempC = new C();
tempC.Name = string.Empty;
for (int k = 0; k < 3; k++)
{
var innerChildB = new B();
innerChildB.Name = string.Empty;
tempC.B.Add(innerChildB);
}
tempB.C.Add(tempC);
}
a.B.Add(tempB);
}
}
序列化:
private void Serialize()
{
try
{
// to Save columnorders to the file
var serializer = new XmlSerializer(typeof(A));
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
using (TextWriter writer = new StreamWriter(@"D:\Test_Jun13.xml"))
{
serializer.Serialize(writer, a, ns);
}
}
catch { }
}
反序列化:
private void DeSerialize()
{
try
{
if (File.Exists(@"D:\Test_Jun13.xml"))
{
var deserializer = new XmlSerializer(typeof(A));
using (TextReader reader = new StreamReader(@"D:\Test_Jun13.xml"))
{
var obj = deserializer.Deserialize(reader);
a = (A)obj;
}
}
}
catch
{
}
}
XML 文件将如下所示:
<?xml version="1.0" encoding="utf-8"?>
<A Name="">
<B Name="">
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
</B>
<B Name="">
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
</B>
<B Name="">
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
</B>
</A>
这会解决您的问题吗?如果对您有帮助,请不要忘记将其标记为答案
我有以下 xml:
<A name="">
<B name="">
<C name="">
<B name=""/>
<B name=""/>
</C>
</B>
<B name="">
<C name="">
<B name=""/>
<B name=""/>
<B name=""/>
<B name=""/>
</C>
</B>
</A>
请注意,元素 C 会创建循环引用,因此我无法使用 XmlSerializer。
如何反序列化和序列化它? 看来我不能使用 DataContractSerializer 因为:
- DataContract 不支持属性("Name" 在我的示例中)
DataContract 不支持忽略外部元素名称,例如
List<B> BList;
将序列化为:
<C name="">
<BList>
<B name=""/>
<B name=""/>
</Blist>
</C>
但我也想保持第一个示例中的结构。
非常感谢。
如果您只关心序列化/反序列化,那么您应该使用支持循环的序列化程序,例如 Json.Net. If I am not mistaken binary serializer 也应该可以。
您可以借助 XML 序列化器和反序列化器
实现此目的Class 结构:
[XmlRoot(ElementName = "A")]
public class A
{
[XmlAttribute("Name")]
public string Name { get; set; }
private List<B> b = new List<B>();
[XmlElement("B")]
public List<B> B
{
get { return b; }
set { b = value; }
}
}
public class B
{
[XmlAttribute("Name")]
public string Name { get; set; }
private List<C> c = new List<C>();
[XmlElement("C")]
public List<C> C
{
get { return c; }
set { c = value; }
}
}
public class C
{
[XmlAttribute("Name")]
public string Name { get; set; }
private List<B> b = new List<B>();
[XmlElement("B")]
public List<B> B
{
get { return b; }
set { b = value; }
}
}
填充对象(根据您的要求更新):
private A a = new A();
private void Load()
{
a.B.Clear();
a.Name = string.Empty;
for (int i = 0; i < 3; i++)
{
var tempB = new B();
tempB.Name = string.Empty;
for (int j = 0; j < 5; j++)
{
var tempC = new C();
tempC.Name = string.Empty;
for (int k = 0; k < 3; k++)
{
var innerChildB = new B();
innerChildB.Name = string.Empty;
tempC.B.Add(innerChildB);
}
tempB.C.Add(tempC);
}
a.B.Add(tempB);
}
}
序列化:
private void Serialize()
{
try
{
// to Save columnorders to the file
var serializer = new XmlSerializer(typeof(A));
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
using (TextWriter writer = new StreamWriter(@"D:\Test_Jun13.xml"))
{
serializer.Serialize(writer, a, ns);
}
}
catch { }
}
反序列化:
private void DeSerialize()
{
try
{
if (File.Exists(@"D:\Test_Jun13.xml"))
{
var deserializer = new XmlSerializer(typeof(A));
using (TextReader reader = new StreamReader(@"D:\Test_Jun13.xml"))
{
var obj = deserializer.Deserialize(reader);
a = (A)obj;
}
}
}
catch
{
}
}
XML 文件将如下所示:
<?xml version="1.0" encoding="utf-8"?>
<A Name="">
<B Name="">
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
</B>
<B Name="">
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
</B>
<B Name="">
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
<C Name="">
<B Name="" />
<B Name="" />
<B Name="" />
</C>
</B>
</A>
这会解决您的问题吗?如果对您有帮助,请不要忘记将其标记为答案