【问题标题】:C# serializer/deserializer with same functionality as XStream in java与 Java 中的 XStream 功能相同的 C# 序列化器/反序列化器
【发布时间】:2016-09-22 13:49:27
【问题描述】:

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

我尝试过XMLSerializerDataContractSerializerNetDataContractSerializer,但似乎没有任何效果,总是有一些问题。

XMLSerializer 不好,因为它要求所有属性都是公开的。 (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 缺少的是“类型”或“命名空间”等元数据。XStream 不需要。我知道反序列化对象的类型,所以我需要编写函数:

public T Deserialize<T>(string xml);

我想要的用例:

var myDeserializedObject = Deserialize<A>(inputString);

我做错了什么?你会以不同的方式解决它吗?

【问题讨论】:

  • 哦,我忘了你不要在 C# 中使用 GETTER 和 SETTERS 你使用属性!!

标签: java c# xml serialization xstream


【解决方案1】:

没有序列化程序可以修复输入错误;)。这对我使用 DataContractSerializer 有用 XML (文本.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" 但不会产生影响,如果您确实需要,您可以将其删除。

【讨论】:

  • 不错!是否也可以有接口?考虑与 C 具有相同接口的 D 类。可以使用 List 代替 List,以便用户可以执行以下操作: ?
  • 是的,您可以自定义DataContractResolver。如果您需要这一切,请不要忘记将其标记为已回答。
  • 你可能想看看 XElement 和 XDocument,它们非常好用,可以让你完全控制对象的创建。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
相关资源
最近更新 更多