Per ottenere maggiore controllo sulla serializzazione, ho convertito una classe da [DataContract] a [Serializable], implementando sia GetObjectData che il costruttore speciale deserializzante. Quando faccio questo, l'XML emesso ora ha informazioni sul tipo applicate a tutti gli elementi. Non voglio questa informazione superflua, e mi chiedo come informare il serializzatore per non emetterlo.Quando si utilizza ISerializable con DataContractSerializer, come posso impedire al serializzatore di emettere informazioni sul tipo?
Ecco il codice di esempio che utilizza [DataContract]:
[DataContract(Namespace = "")]
class Test
{
public Test() { }
[DataMember]
public Nullable<int> NullableNumber = 7;
[DataMember]
public int Number = 5;
public static void Go()
{
var test = new Test();
var dcs = new DataContractSerializer(typeof(Test));
using (var s = new StreamWriter("test.xml"))
{
dcs.WriteObject(s.BaseStream, test);
}
}
}
Emette il seguente codice XML (nota nessun tipo informazioni Nullable Numero e Numero - questo è il risultato desiderato):
<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<NullableNumber>7</NullableNumber>
<Number>5</Number>
</Test>
Se modifico il codice precedente come segue (aggiunta [Serializable],: ISerializable, ei due metodi di serializzazione):
[Serializable]
class Test : ISerializable
{
public Test() { }
public Nullable<int> NullableNumber = 7;
public int Number = 5;
public static void Go()
{
var test = new Test();
var dcs = new DataContractSerializer(typeof(Test));
using (var s = new StreamWriter("test.xml"))
{
dcs.WriteObject(s.BaseStream, test);
}
}
public Test(SerializationInfo info, StreamingContext context)
{
NullableNumber = info.GetInt32("NullableNumber");
Number = info.GetInt32("Number");
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("NullableNumber", NullableNumber);
info.AddValue("Number", Number);
}
}
Ora emette il seguente codice XML. Notare le informazioni sul tipo (i: type = "x: int") aggiunte a ciascun elemento.
<Test xmlns="http://schemas.datacontract.org/2004/07/XMLSerialization" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="http://www.w3.org/2001/XMLSchema">
<NullableNumber i:type="x:int" xmlns="">7</NullableNumber>
<Number i:type="x:int" xmlns="">5</Number>
</Test>
Perché lo fa? Come faccio a impedirgli di farlo?
Grazie!
Grazie per la domanda, perché ha risolto la mia domanda :-) Per quanto riguarda "perché" - nel primo esempio c'era una garanzia che ogni voce è un campo, quindi è possibile ottenere il tipo di campo solo cercando al tipo 'Test'. Nel secondo caso ** tu ** hai il controllo, quindi quelle voci non devono necessariamente essere campi, potresti scrivere/leggere solo dati casuali. – astrowalker