有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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>

{}缺少的是元数据,如“类型”或“名称空间”等。{}不需要这些。我知道反序列化对象的类型,所以我需要编写函数:

public T Deserialize<T>(string xml);

我想要的用例:

var myDeserializedObject = Deserialize<A>(inputString);

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


共 (1) 个答案

  1. # 1 楼答案

    没有序列化程序将修复键入错误;)。这对我使用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“但是没有什么区别,如果你真的需要的话,你可以把它去掉