3

クラスBをitaベースクラスAのインスタンスとしてシリアル化しようとしています。 DataContractSerializerは私にそれを許可しません。次のようにシリアライズに失敗継承型のDataContractシリアル化をベース型に

例は次のとおりです。

class Program 
{ 
    [DataContract] 
    public class A 
    { 
     public int Id { get; set; } 
    } 

    [DataContract] 
    public class B : A 
    { 

    } 


    static void Main(string[] args) 
    { 
     A instance = new B { Id = 42 }; 

     var dataContractSerializer = new DataContractSerializer(typeof(A)); 
     var xmlOutput = new StringBuilder(); 
     using (var writer = XmlWriter.Create(xmlOutput)) 
     { 
      dataContractSerializer.WriteObject(writer, instance); 
     } 

    } 
} 

私は問題を簡単に追加KnownTypes属性によって解決されることを知っています。 しかし、クラスBをプロジェクトから非表示にしたい(参照を追加しない)。

私が望むことを達成することは、すべて可能ですか?私はXmlSerializerを試しましたが、同じ問題が発生しました(XMLに完全なインスタンスの型名が追加されました)。

+0

を与える

class Program { [DataContract] public class A { public int Id { get; set; } } [DataContract] public class B : A { } static void Main(string[] args) { A instance = new B { Id = 42 }; var dataContractSerializer = new DataContractSerializer(typeof(A), new List<Type>() { typeof(B) }); var xmlOutput = new StringBuilder(); using (var writer = XmlWriter.Create(xmlOutput)) { dataContractSerializer.WriteObject(writer, instance); } } } 

は、それがXMLである必要がありますか?または、それだけでは動作しなければなりませんか? –

+0

それはちょうどうまくいくことができます。最低限の手間はかかります。 – R4cOON

答えて

3
[DataContract(Name="YouCannotSeeMyName")] 
[KnownTypes(typeof(B))] 
public class B : A 

そして、あなたは私はあなたがが契約の部分を隠すことができないことをかなり確信して

<A itype="YouCannotSeeMyName"> 
    ... 
</A> 
+0

これはまだOPの意図ではなかったBのすべてのメンバーをシリアライズすると思います。 –

+0

@マークAvenius:OPがBのプロパティに '[DataMember]'属性を入れていない場合はありません。 –

+0

優れた点:-) –

1

を取得します。これは、セリアライズ/デシリアライズの方法と内容を理解するために、各エンドで契約を尊重しなければならないWebサービスを扱う場合と同じです。

さらに、属性を使用してDataContractSerializer内のBタイプを渡すことができます。 ...あなた

<Program.A xmlns:i="http://www.w3.org/2001/XMLSchema-instance" i:type="Program.B" 
xmlns="http://schemas.datacontract.org/2004/07/ConsoleApplication1" />