Eu tenho uma classe c # que eu herdei. Eu "construí" com sucesso o objeto. Mas preciso serializar o objeto para XML. Existe uma maneira fácil de fazer isso?
Parece que a classe foi configurada para serialização, mas não sei como obter a representação XML. Minha definição de classe é assim:
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.domain.com/test")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.domain.com/test", IsNullable = false)]
public partial class MyObject
{
...
}
Aqui está o que eu pensei que poderia fazer, mas não funciona:
MyObject o = new MyObject();
// Set o properties
string xml = o.ToString();
Como obtenho a representação XML deste objeto?
c#
xml-serialization
user462166
fonte
fonte
Respostas:
Você precisa usar o XmlSerializer para serialização XML. Abaixo está um exemplo de trecho.
fonte
XmlWriter writer = XmlWriter.Create(sww);
XmlTextWriter writer = new XmlTextWriter(sww) { Formatting = Formatting.Indented };
em vez deXmlWriter writer = XmlWriter.Create(sww);
XmlWriter
encapsula o queStringWriter
você não precisa dispor dos dois (o primeiro uso é redundante), certo? Estou assumindo queXmlWriter
se encarrega de eliminá-lo ...XmlWriter
não está encapsulandoStringWriter
, está utilizando o seu passeStringWriter
e não tem nenhuma expectativa / responsabilidade de descartá-lo. Além dissoStringWriter
está foraXmlWriter
do escopo, você ainda pode querer quandoXmlWriter
descartado, seria um mau comportamento paraXmlWriter
descartar o seuStringWriter
. Como regra geral, se você declarar algo que precisa ser descartado, é responsável por descartá-lo. E implícito a essa regra, qualquer coisa que você não se declara não deve descartar. Então, ambosusing
são necessários.Modifiquei o meu para retornar uma string em vez de usar uma variável ref como abaixo.
Seu uso seria assim:
fonte
Exception
lá, você estendeu o StackTrace com o método "Serialize <>".A função a seguir pode ser copiada para qualquer objeto para adicionar uma função de salvar XML usando o espaço para nome System.Xml.
Para criar o objeto a partir do arquivo salvo, adicione a seguinte função e substitua [ObjectType] pelo tipo de objeto a ser criado.
fonte
writer.Flush()
é redundante em umusing
bloco -writer
'sDispose()
método irá liberá-lo para você.Classe de extensão:
Uso:
Basta referenciar o espaço para nome que contém seu método de extensão no arquivo em que você gostaria de usá-lo e ele funcionará (no meu exemplo seria:
using MyProj.Extensions;
)Observe que, se você quiser tornar o método de extensão específico para apenas uma classe específica (por exemplo,
Foo
), poderá substituir oT
argumento no método de extensão, por exemplo.public static string Serialize(this Foo value){...}
fonte
Você pode usar a função abaixo para obter XML serializado de qualquer objeto.
Você pode chamar isso do cliente.
fonte
Para serializar um objeto, faça:
Lembre-se também de que, para o XmlSerializer funcionar, você precisa de um construtor sem parâmetros.
fonte
Começarei com a resposta de cópia de Ben Gripka:
Eu usei esse código anteriormente. Mas a realidade mostrou que esta solução é um pouco problemática. Normalmente, a maioria dos programadores apenas serializa as configurações em salvar e desserializa as configurações em carga. Este é um cenário otimista. Depois que a serialização falhou, por algum motivo, o arquivo é parcialmente gravado, o arquivo XML não está completo e é inválido. Consequentemente, a desserialização de XML não funciona e seu aplicativo pode falhar no início. Se o arquivo não for grande, sugiro primeiro serializar o objeto para
MemoryStream
gravar o fluxo no arquivo. Este caso é especialmente importante se houver alguma serialização personalizada complicada. Você nunca pode testar todos os casos.A desserialização no cenário do mundo real deve contar com o arquivo de serialização corrompido, isso acontece em algum momento. A função de carga fornecida por Ben Gripka está correta.
E pode ser envolvido por algum cenário de recuperação. É adequado para arquivos de configurações ou outros arquivos que podem ser excluídos em caso de problemas.
fonte
Todas as respostas acima votadas estão corretas. Esta é apenas a versão mais simples:
fonte
É um pouco mais complicado do que chamar o
ToString
método da classe, mas não muito.Aqui está uma função simples que você pode usar para serializar qualquer tipo de objeto. Retorna uma string contendo o conteúdo XML serializado:
fonte
Aqui está um bom tutorial sobre como fazer isso
Você deve basicamente usar
System.Xml.Serialization.XmlSerializer
classe para fazer isso.fonte
Você pode criar e armazenar o resultado como arquivo xml no local desejado.
fonte
meu código de trabalho. Retorna utf8 xml enable espaço para nome vazio.
Exemplo retorna resposta Yandex api payment Aviso url:
fonte
Eu tenho uma maneira simples de serializar um objeto para XML usando C #, funciona muito bem e é altamente reutilizável. Eu sei que esse é um tópico mais antigo, mas eu queria postar isso porque alguém pode achar isso útil para eles.
Aqui está como eu chamo o método:
Aqui está a classe que faz o trabalho:
Nota: Como esses são métodos de extensão, eles precisam estar em uma classe estática.
fonte
Com base nas soluções acima, aqui está uma classe de extensão que você pode usar para serializar e desserializar qualquer objeto. Quaisquer outras atribuições XML dependem de você.
Apenas use-o assim:
fonte
Ou você pode adicionar este método ao seu objeto:
fonte
Aqui está um código básico que ajudará a serializar os objetos C # em xml:
fonte
Você precisa usar as seguintes classes:
fonte