2016-09-22 3 views
0

私は非常に単純なタスクを達成する必要があります:オブジェクト階層を直列化および逆シリアル化します。JavaのXStreamと同じ機能を持つC#シリアライザ/デシリアライザ

私は試しましたXMLSerializerDataContractSerializer、、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のようなメタデータがあります。私は、オブジェクトをデシリアライズの種類を知っているので、私は関数を記述する必要があります。

public T Deserialize<T>(string xml); 

私の希望ユースケース:

var myDeserializedObject = Deserialize<A>(inputString); 

私が間違って何をしているのですか?別の方法で解決しますか?

+0

Oと私は忘れてしまいました.GETTERとSETTERSをC#で使用しないでください! –

答えて

1

入力ミスを修正するシリアライザはありません。 I = "HTTP:これは、あなたがそれをのxmlnsを追加する記述する場合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); 
} 

を使用して私のために働きました。 //www.w3.org/2001/XMLSchema-instance "に変更しても差し支えありません。本当に必要な場合は削除することができます。

+0

ニース!そこにもインターフェイスがありますか? <...> : が代わりに一覧のC.と同じインタフェースを持つクラスDを考えるユーザーが何かを行うことができますので、一覧にありだろうか? –

+0

はい、カスタム[DataContractResolver](https://msdn.microsoft.com/en-us/library/ee358759%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396)を作成することができます。あなたが必要としているすべてのものを答えたものとして忘れないでください。 –

+0

OあなたはXElementとXDocumentを使いたいと思うかもしれません。使用するのがとてもいいですし、オブジェクトの作成を完全にコントロールすることができます。 –

関連する問題