1

DCSを使用して、XMLからオブジェクトを逆シリアル化しようとしています。ここで、シリアル化されたオブジェクトは、クラスBaseを継承するChild型であり、Childには、逆シリアル化されたが後でコードでクラスBaseに移動されたプロパティがいくつかあります。現在、これらのプロパティは逆シリアル化されません。

このXMLを見てください:

<Base i:type="a:DirectoryEntry" xmlns="http://schemas.datacontract.org/2004/07/pending.Core.Models" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://schemas.datacontract.org/2004/07/pending.Core.Models.Directory">
    <Active>true</Active>
    <ContentType>DirectoryEntry</ContentType>
    <Created>2012-03-12T11:51:25.3401552+01:00</Created>
    <a:Location>location</a:Location>
    <a:OpenHours>opening</a:OpenHours>
</Base>

xmlns:aは、派生型名を示します。このクラスは、それらの小道具を保持するために使用されました。これで、それらはBaseクラスに移動され、DCSによって逆シリアル化されなくなりました(逆シリアル化後のプロパティはnullになります)。プロパティの前に:(この場合はLocationとOpenHours)を付けてプロパティについて話します。

これらのファイルにはデータがたくさんあります。DCSでこれらのファイルを正しく逆シリアル化するための私のオプションは何ですか?

[KnownType]属性はBaseクラスとChildクラスの両方で使用されていることに注意してください

4

3 に答える 3

1

プロパティを基本クラスに移動すると、事実上別の XML 名前空間に移動しました。基本クラスはおそらく名前空間pending.Core.Modelsで定義され、派生クラスはで定義されます(属性のプロパティでpending.Core.Models.Directory何も指定しなかったと仮定しています。したがって、要素があるべき名前空間を変更した場合、シリアライザーが勝ちました最後の 2 つのプロパティを基本クラスに移動した場合は、XML 要素との名前空間を変更する必要があります。Namespace[DataContract]LocationOpenHours

<Base i:type="a:DirectoryEntry"
      xmlns="http://schemas.datacontract.org/2004/07/pending.Core.Models"
      xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:a="http://schemas.datacontract.org/2004/07/pending.Core.Models.Directory">
  <Active>true</Active>
  <ContentType>DirectoryEntry</ContentType>
  <Created>2012-03-12T11:51:25.3401552+01:00</Created>
  <Location>location</Location>
  <OpenHours>opening</OpenHours>
</Base>
于 2012-05-10T22:33:33.727 に答える
0

私の解決策は、プロパティを元のクラスに戻し、最初に移動したクラスにプロパティを残すことでした。これで警告が表示されますが、Property hides the inherited member...Use the new keyword if hiding was intended逆シリアル化が再び機能するようになったため、あるプロバイダーから別のプロバイダーにデータを移動できます。他の解決策を見つけることができず、シリアル化されたすべてのデータファイルを変更することはできませんでした。

于 2012-05-14T17:37:35.523 に答える