C# serializer/deserializer 与 java 中的 XStream 具有相同的功能
C# serializer/deserializer with same functionality as XStream in java
我需要完成非常简单的任务:序列化和反序列化对象层次结构。
我试过XMLSerializer
、DataContractSerializer
、NetDataContractSerializer
,但似乎没有任何效果,总是有问题。
XMLSerializer
不好,因为它要求所有属性都是 public。
(Net)DataContractSerializer(s) 很糟糕,因为它总是缺少一些元数据——但是当用户创建 XML 时没有元数据。
那么你会如何解决这个任务?考虑 类:
class A {
private B instanceB;
private int integerValue;
... getters/setters
}
class B {
private List<C> cInstanceList;
private string stringValue;
... getters/setters
}
class C {
... some other properties
... getters/setters
}
和用户输入:
<A>
<B>
<cInstanceList>
<C>
<someproperties>val</someproperties>
</C>
<C>
<someproperties>differentVal</someproperties>
</C>
</cInstanceList>
<strigValue>lalala<stirngValue>
</B>
<integerValue>42</integerValue>
</A>
DataContractors
缺少的是 "Type" 或 "Namespace" 等元数据。XStream
不需要这些。我知道反序列化对象的类型,所以我需要写函数:
public T Deserialize<T>(string xml);
我想要的用例:
var myDeserializedObject = Deserialize<A>(inputString);
我做错了什么?你会以不同的方式解决它吗?
没有序列化程序可以修复输入错误 ;)。这对我有用 DataContractSerializer
XML (text.xml)
<A>
<B>
<cInstanceList>
<C>
</C>
<C>
</C>
</cInstanceList>
<stringValue>lalala</stringValue>
</B>
<integerValue>42</integerValue>
</A>
类
[DataContract(Namespace="")]
class A
{
[DataMember(Name = "B")]
private B instanceB;
[DataMember(Name = "integerValue")]
private int integerValue;
public A(B instanceB, int integerValue)
{
this.instanceB = instanceB;
this.integerValue = integerValue;
}
}
[DataContract(Namespace = "")]
class B
{
[DataMember(Name = "cInstanceList")]
private List<C> cInstanceList;
[DataMember(Name = "stringValue")]
private string stringValue;
public B(List<C> cInstanceList, string stringValue)
{
this.cInstanceList = cInstanceList;
this.stringValue = stringValue;
}
}
[DataContract(Namespace = "")]
class C
{
}
阅读
var dcs = new DataContractSerializer(typeof(A));
using (Stream reader = File.OpenRead("text.xml"))
{
var result = (A)dcs.ReadObject(reader);
}
如果你写它会添加 xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 但不会有什么不同你可以删除它如果你真的需要。
我需要完成非常简单的任务:序列化和反序列化对象层次结构。
我试过XMLSerializer
、DataContractSerializer
、NetDataContractSerializer
,但似乎没有任何效果,总是有问题。
XMLSerializer
不好,因为它要求所有属性都是 public。
(Net)DataContractSerializer(s) 很糟糕,因为它总是缺少一些元数据——但是当用户创建 XML 时没有元数据。
那么你会如何解决这个任务?考虑 类:
class A {
private B instanceB;
private int integerValue;
... getters/setters
}
class B {
private List<C> cInstanceList;
private string stringValue;
... getters/setters
}
class C {
... some other properties
... getters/setters
}
和用户输入:
<A>
<B>
<cInstanceList>
<C>
<someproperties>val</someproperties>
</C>
<C>
<someproperties>differentVal</someproperties>
</C>
</cInstanceList>
<strigValue>lalala<stirngValue>
</B>
<integerValue>42</integerValue>
</A>
DataContractors
缺少的是 "Type" 或 "Namespace" 等元数据。XStream
不需要这些。我知道反序列化对象的类型,所以我需要写函数:
public T Deserialize<T>(string xml);
我想要的用例:
var myDeserializedObject = Deserialize<A>(inputString);
我做错了什么?你会以不同的方式解决它吗?
没有序列化程序可以修复输入错误 ;)。这对我有用 DataContractSerializer XML (text.xml)
<A>
<B>
<cInstanceList>
<C>
</C>
<C>
</C>
</cInstanceList>
<stringValue>lalala</stringValue>
</B>
<integerValue>42</integerValue>
</A>
类
[DataContract(Namespace="")]
class A
{
[DataMember(Name = "B")]
private B instanceB;
[DataMember(Name = "integerValue")]
private int integerValue;
public A(B instanceB, int integerValue)
{
this.instanceB = instanceB;
this.integerValue = integerValue;
}
}
[DataContract(Namespace = "")]
class B
{
[DataMember(Name = "cInstanceList")]
private List<C> cInstanceList;
[DataMember(Name = "stringValue")]
private string stringValue;
public B(List<C> cInstanceList, string stringValue)
{
this.cInstanceList = cInstanceList;
this.stringValue = stringValue;
}
}
[DataContract(Namespace = "")]
class C
{
}
阅读
var dcs = new DataContractSerializer(typeof(A));
using (Stream reader = File.OpenRead("text.xml"))
{
var result = (A)dcs.ReadObject(reader);
}
如果你写它会添加 xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 但不会有什么不同你可以删除它如果你真的需要。