Mam klasę danych, która jest serializowana z DataContractSerializer
. Klasa używa atrybutu [DataContract]
bez wyraźnej deklaracji Namespace
. W związku z tym przestrzeń nazw w wynikowym pliku XML jest generowana w oparciu o przestrzeń nazw klasy.DataContractSerializer - zmień przestrzeń nazw i deserializuj plik powiązany ze starą przestrzenią nazw
Klasa zasadniczo wygląda następująco:
namespace XYZ
{
[DataContract]
public class Data
{
[DataMember(Order = 1)]
public string Prop1 { get; set; }
[DataMember(Order = 2)]
public int Prop2 { get; set; }
}
}
... i powstały xml:
<?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>
Teraz chcę zmienić nazw klasy (właściwie usunąć go) poprzez zmianę atrybut [DataContract]
na [DataContract(Namespace = "")]
. Jednakże, gdy już to zrobię, każdy plik poprzednio serializowany z oryginalną przestrzenią nazw, nie będzie już deserializowany. Otrzymuję następujący wyjątek:
Error in line 1 position XXX. Expecting element 'Data' from namespace ''.. Encountered 'Element' with name 'Data', namespace 'http://schemas.datacontract.org/2004/07/XYZ'.
to sens. Zmieniłem przestrzeń nazw. Nie przeszkadza mi to. Jednak wydaje się, że musi istnieć sposób, aby powiedzieć DataContractSerializer
, aby kontynuować i deserializować te dane, nawet jeśli przestrzenie nazw się nie zgadzają.
Dlaczego chcesz określić pusty ciąg dla przestrzeni nazw w atrybucie DataContract? Co zyskujesz, robiąc to? –
Nie uzyskuję przywiązania do przestrzeni nazw CLR klasy; i to jest naprawdę problem tutaj. Ta klasa zmienia jego przestrzeń nazw CLR i nie chcę być związana z tą szczegółowością implementacji. Mógłbym oczywiście zdefiniować wartość przestrzeni nazw xml, którą mógłbym utrzymać na stałym poziomie. Ale dla tej implementacji nie widzę korzyści z tego, w przeciwieństwie do po prostu usuwania przestrzeni nazw xml. Jest to używane do prostego serializowania plików. – harlam357