Para tener más control sobre la serialización, he convertido una clase de [DataContract] a [Serializable], implementando tanto GetObjectData como el constructor de deserialización especial. Cuando hago esto, el XML emitido ahora tiene información de tipo aplicada a todos los elementos. No quiero esta información superflua, y me pregunto cómo informar al serializador para que no la emita.Al usar ISerializable con DataContractSerializer, ¿cómo impido que el serializador genere información de tipo?
Aquí está el código de ejemplo que utiliza [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);
}
}
}
Esto genera el siguiente código XML (no notará ninguna información de tipo de anulable Número y número - esta es la salida deseada):
<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<NullableNumber>7</NullableNumber>
<Number>5</Number>
</Test>
Si modifico el código anterior de la siguiente manera (la adición de [Serializable],: ISerializable, y los dos métodos de serialización):
[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);
}
}
Ahora emite el siguiente XML. Observe la información de tipo (i: type = "x: int") agregada a cada 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>
¿Por qué está haciendo esto? ¿Cómo evito que lo haga?
Gracias!
Gracias por la pregunta, porque resolvió mi pregunta :-) En cuanto a "por qué" - en el primer ejemplo había una garantía de que cada entrada es un campo, por lo que puede obtener el tipo de campo simplemente mirando en el tipo 'Test'. En el segundo caso ** usted ** tiene el control, por lo tanto, esas entradas no tienen que ser campos en absoluto, podría estar escribiendo/leyendo solo datos aleatorios. – astrowalker