私はDataContractSerializer
でシリアル化されたデータクラスを持っています。このクラスでは、Namespace
宣言のない[DataContract]
属性が使用されます。したがって、結果として得られるXMLファイル内の名前空間は、クラスの名前空間に基づいて生成されます。DataContractSerializer - 名前空間を変更し、古い名前空間にバインドされたファイルの逆シリアル化
クラスは基本的に次のようになります。変更することにより、
<?xml version="1.0" encoding="utf-8"?>
<Data xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/XYZ">
<Prop1>StringValue</Prop1>
<Prop2>11</Prop2>
</Data>
は今、私はクラスの名前空間を変更したい(実際にはそれを削除):
namespace XYZ
{
[DataContract]
public class Data
{
[DataMember(Order = 1)]
public string Prop1 { get; set; }
[DataMember(Order = 2)]
public int Prop2 { get; set; }
}
}
...と結果のXML [DataContract]
属性は[DataContract(Namespace = "")]
です。しかし、いったんこれを行うと、元の名前空間で以前に直列化されたファイルは、デシリアライズされなくなりました。私は次の例外を受け取る:
Error in line 1 position XXX. Expecting element 'Data' from namespace ''.. Encountered 'Element' with name 'Data', namespace 'http://schemas.datacontract.org/2004/07/XYZ'.
これは完璧な理にかなっています。私は名前空間を変更しました。私はそれで大丈夫です。しかし、DataContractSerializer
に名前空間が一致しなくてもそのデータを逆シリアル化するよう指示する必要があるようです。
なぜ、DataContract属性の名前空間に空の文字列を指定したいのですか?あなたは何をしているのですか? –
私はクラスのCLR名前空間に縛られていません。それが本当にここの問題です。このクラスはCLR名前空間を変更しています。その実装の詳細に縛られたくありません。私はもちろん、一定に保つことができるxml名前空間の値を定義することができます。しかし、この実装では、xml名前空間を単に削除するのではなく、その実装の利点がわかりません。これは単純なファイルのシリアライゼーションに使用されています。 – harlam357