Pergunta

OBSERVAÇÃO: XMLIgnorar NÃO é a resposta!

OK, seguindo minha pergunta em Serialização XML e tipos herdados, comecei a integrar esse código ao meu aplicativo em que estou trabalhando, pensando estupidamente que tudo correria bem.

Tive problemas com algumas classes que implementei IEnumerable e ICollection<T>

O problema com eles é que quando o XMLSerializer os serializa, ele os vê como uma propriedade externa e, em vez de usar a propriedade que gostaríamos (ou seja,aquele com o nosso AbstractXmlSerializer ) ele vem aqui e cai (devido à incompatibilidade de tipo), praticamente nos colocando de volta à estaca zero.Você não pode decorar esses métodos com o XmlIgnorar atributo também, então não podemos pará-lo dessa forma.

Minha solução atual é remover a implementação da interface (nesta aplicação atual, não é grande coisa, apenas deixou o código mais bonito).

Preciso engolir meu orgulho e aceitar que isso não pode ser feito? Eu sei que empurrei e tirei mais proveito do XmlSerializer do que o esperado :)


Editar

Devo acrescentar também que estou trabalhando atualmente no framework 2.


Atualizar

Eu aceitei resposta de lomaxx.No meu cenário, não posso fazer isso, mas sei que funcionará.Como não houve outras sugestões, acabei removendo a implementação da interface do código.

Foi útil?

Solução

você pode contornar esse problema obtendo a dll System.RunTime.Serialization (é um assembly .net 3.x) e referenciando-a em seu aplicativo .net 2.0.Isso funciona porque os binários .net 3.0 são compilados para rodar no CLR .net 2.0.

Ao fazer isso, você obtém acesso ao DataContractSerliazer que usei para contornar um problema semelhante em que queria passar um ICollection como parâmetro para um webservice e o xmlserializer não sabia como lidar com isso corretamente.

Se você concordar em usar a dll .net 3.x em seu aplicativo 2.x, poderá usar o DataContractSerializer para resolver esse problema

Outras dicas

acho que a resposta chega tarde demais para ser útil para sua aplicação específica, mas talvez haja outras pessoas com o mesmo problema.

suponho que você possa implementar IXmlSerializable para o tipo IEnumerable para solucionar esse comportamento.no entanto, isso significa que você precisa controlar totalmente o processo de serialização desse tipo.uma abordagem simples para não ter que mexer com o XmlReader/XmlWriter, você pode escrever uma classe de adaptador xml auxiliar com ctor público e propriedades públicas de leitura-gravação de todos os dados a serem serializados e criar um objeto XmlSerializer temporário para este tipo dentro IXmlSerializable.[Ler|Escrever]Xml().

class Target : IEnumerable<Anything>, IXmlSerializable
{
//...

public void ReadXml(System.Xml.XmlReader reader)
{
    reader.ReadStartElement();
    TargetXmlAdapter toRead = (TargetXmlAdapter)new XmlSerializer(typeof(TargetXmlAdapter)).Deserialize(reader);
    reader.Read();

    // here: install state from TargetXmlAdapter
}

public void WriteXml(System.Xml.XmlWriter writer)
{
    // NOTE: TargetXmlAdapter(Target) is supposed to store this' state being subject to serialization
    new XmlSerializer(typeof(TargetXmlAdapter)).Serialize(writer, new TargetXmlAdapter(this));
}
}

Se você usar estes atributos:

        [XmlArray("ProviderPatientLists")]
        [XmlArrayItem("File")]
      public ProviderPatientList Files
    {
        get { return _ProviderPatientLists; }
        set
        {
            _ProviderPatientLists = value;
        }
    }

Onde ProviderPatientList herda List<PatientList>

Em seguida, você pode ter mais controle sobre o xml gerado criará

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top