2009-04-02 10 views
8

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!

+0

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

Respuesta

0

¿Necesita el ISerializable aquí? ¿Cuál fue el DataContractSerializer normal que no te da? Si vuelves a esto, debería funcionar bien.

Básicamente, mediante la implementación de la serialización personalizada, los datos ya no están basados ​​en contratos, por lo que tiene para incluir esta información adicional para garantizar que pueda comprenderla más adelante.

Entonces: ¿hay alguna razón para implementar ISerializable en este caso?

+0

Recorté el ejemplo para facilitar la pregunta. Necesito serialización personalizada por razones que no muestro aquí. – Eric

+0

De la (larga lista) de razones por las que necesito una serialización personalizada, la más importante es que necesito dar salida condicionalmente ciertas propiedades basadas en otra información. – Eric

+1

No entiendo su comentario sobre "tiene" que incluir esta información adicional ". De hecho, el primer ejemplo de XML anterior se deserializa perfectamente con el deserializador [Serializable], por lo que el deserializador no necesita este tipo de información. – Eric

Cuestiones relacionadas