c#序列化器/反序列化器具有与java中的XStream相同的功能

本文关键字:XStream 中的 功能 java 序列化 反序列化 | 更新日期: 2023-09-27 18:08:14

我需要完成一个非常简单的任务:序列化和反序列化对象层次结构。

我试过XMLSerializer, DataContractSerializer, NetDataContractSerializer,但似乎没有工作,总是有一些问题。

XMLSerializer是坏的,因为它要求所有的属性都是公共的。(Net)DataContractSerializer很糟糕,因为它总是缺少一些元数据——但是当用户创建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缺少的是"类型"或"命名空间"等元数据。XStream不需要这个。我知道反序列化对象的类型,所以我需要写function:

public T Deserialize<T>(string xml);

我想要的用例:

var myDeserializedObject = Deserialize<A>(inputString);

我做错了什么?你会用不同的方法来解决吗?

c#序列化器/反序列化器具有与java中的XStream相同的功能

没有序列化器可以修复输入错误;)。这对我使用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",但不会有什么不同,你可以删除它,如果你真的需要。