Pergunta

Eu gostaria de serializar e desserializar objetos sem ter que se preocupar com todo o gráfico de classe.

A flexibilidade é fundamental. Eu gostaria de ser capaz de serializar qualquer objeto passado para mim sem atributos completos necessários ao longo de todo o gráfico do objeto.

Isso significa que binário serialização não é uma opção, pois só funciona com as outras plataformas .NET. Eu gostaria Também gosto de algo legível por um pessoa, e assim por um decifráveis programa de gestão e outros intérpretes.

Eu encontrei problemas usando o DataContract, JSON, e Serializers XML.

  • A maioria destes erros parecem centro em torno de serialização de listas / Dicionários (ou seja, XML Serializable dicionário genérico ).
  • "Adicionar quaisquer tipos não conhecidos estaticamente à lista de tipos conhecidos - para exemplo, utilizando o atributo KnownTypeAttribute ou por adicioná-los à lista de conhecidos tipos passado para DataContractSerializer. "

Por favor basear suas respostas em experiências reais e não teoria ou leitura de um artigo.

Foi útil?

Solução

Você já considerou a serialização para JSON em vez de XML?

Json.NET tem uma serializer realmente poderoso e flexível que não tem problemas com hashtables / dicionários genéricos e não requer quaisquer atributos particulares. Eu sei porque eu o escrevi:)

Ela dá-lhe montes de controle através de várias opções na serializer e permite substituir como um tipo é serializado criando um JsonConverter para ele.

Na minha opinião JSON é legível mais humano do que XML e Json.NET dá a opção de escrever bem formatado JSON.

Por fim, o projeto é de código aberto para que você possa entrar no código e fazer modificações, se você precisa.

Outras dicas

Se bem me lembro ele funciona algo como isto com uma propriedade:

[XmlArray("Foo")]
[XmlArrayItem("Bar")]
public List<BarClass> FooBars
{ get; set; }

Se você serializado este que você deseja obter algo como:

<Foo>
    <Bar />
    <Bar />
</Foo>

Claro, eu provavelmente deve adiar para os especialistas. Aqui está mais informações MS: http: // MSDN. microsoft.com/en-us/library/system.xml.serialization.xmlarrayitemattribute.aspx

Deixe-me saber se isso funciona para você.

De suas necessidades soa como serialização XML é melhor.

Que tipo de problemas você tem com coleções quando a serialização? Se você está se referindo a não saber quais atributos para usar em uma lista ou algo semelhante, você pode tentar o atributo XmlArray em sua propriedade. Você pode definitivamente serializar uma coleção.

O IntermediateSerializer no XNA Framework é muito legal mínima. Você pode encontrar um monte de tutoriais em usá-lo em http://blogs.msdn.com/shawnhar

SABÃO serialização funcionou bem para mim, mesmo para objetos não marcados com [Serializable]

Você vai ter problemas com a coleta de serialização se objetos na coleção contém qualquer referência a outros objetos na mesma coleção. Se qualquer tipo de dual-apontando existe, você acaba criando uma multi-mapa que não pode ser serializado. Em cada problema que eu já tinha a serialização de uma coleção personalizada, era sempre por causa de algumas funcionalidades adicionais que eu precisava que funcionou bem, como parte de uma aplicação "típico" cliente-servidor, e em seguida, falhou miseravelmente como parte de um provedor-consumidor -server aplicação.

Coloque todas as classes que você deseja serializar em um assembly separado, e depois usar a ferramenta SGen para gerar uma serialização montagem para serialize para XML. Use atributos XML para serialização controle.

Se você precisa para personalizar a serialização de montagem (e você irá necessidade de que a aulas de apoio que não são IXmlSerializable e classes que contêm resumo nós), em seguida, instruir SGen para despejar o código-fonte em um separar arquivo e, em seguida, adicioná-lo à sua solução. Depois, você pode modificá-lo conforme necessário.

http://msdn.microsoft.com/ en-us / library / bk3w6240 (VS.80) .aspx

FWIW, eu consegui serializar todo o quadro AdsML (mais de 400 classes) usando esta técnica. Ele fez exigem um monte de personalização manual, mas não há nenhuma obtenção em torno de que, se você considerar o tamanho do quadro. (Eu usei uma ferramenta separada para ir de XSD para C #)

Eu concordo que os métodos de serialização baseadas em DataContract (para JSON, XML, etc) é um pouco mais complexa do que eu gostaria.

Se você está tentando obter JSON verificar http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

É parte das extensões de MS AJAX. É certo que é marcada como obsoleta no .NET 3.5, mas ScottGu menciona em seu comentário no blog aqui ( http://weblogs.asp.net/scottgu/archive/2007/10/01/tip-trick --Construção-a-toJSON-extensão de método utilizando-net-3-5.aspx # 4301973 ) que ele não tem certeza por que e deve ser apoiada por um pouco mais.

A coisa mais simples a fazer é marcar seus objetos com o atributo Serializable e então usar um formatador binário para lidar com a serialização. O gráfico classe inteira não deve ser um problema, desde que todos os objetos contidos também são marcados como Serializable.

Talvez uma rota mais eficiente seria para serializar usando o BinaryFormatter

Como copiado de http://blog.paranoidferret.com/index.php/2007/04/27/csharp-tutorial-serialize-objects-to-a-file/

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class Serializer
{
   public Serializer()
   {
   }

   public void SerializeObject(string filename,
                  ObjectToSerialize objectToSerialize)
   {
      Stream stream = File.Open(filename, FileMode.Create);
      BinaryFormatter bFormatter = new BinaryFormatter();
      bFormatter.Serialize(stream, objectToSerialize);
      stream.Close();
   }

   public ObjectToSerialize DeSerializeObject(string filename)
   {
      ObjectToSerialize objectToSerialize;
      Stream stream = File.Open(filename, FileMode.Open);
      BinaryFormatter bFormatter = new BinaryFormatter();
      objectToSerialize =
         (ObjectToSerialize)bFormatter.Deserialize(stream);
      stream.Close();
      return objectToSerialize;
   }
}

Para interoperabilidade que sempre usaram serialização XML e fez com que a nossa classe foi projetado desde o início para fazê-lo corretamente.

Nós criamos um documento de esquema XSD e gerar um conjunto de classes de que o uso de XSD.exe. Isso gera classes parciais para que, em seguida, criar um conjunto de correspondentes classes parciais para adicionar os métodos extra Queremos ajudar-nos povoam as classes e usá-los em nossa aplicação (como eles estão focados em serializadas e deserialising e são uma difficut pouco para usar, por vezes, ).

Você deve usar o NetDataContractSerializer. Ele cobre qualquer tipo de objeto gráfico e suporta os genéricos, listas, polimorfismo (não é necessário o atributo KnownType aqui), recursão e etc. A única desvantagem é que você tem que marcar todos vocês classes com [Serializable] / [DataContract] atributos, mas a experiência mostra que você tem que fazer algum tipo de ajuste fino manual de qualquer maneira uma vez que nem todos os membros devem ser persistentes. Também ele serializa em um XML, embora a sua legibilidade é questionável.

Nós tivemos os mesmos requisitos que o seu e escolheu esta solução.

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