Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Deserialização de objetos com set privado

Olá

Estou praticando a exportação de arquivos XML com a classe (XmlSerializer) em um projeto de testes que criei, ao tentar realizar a exportação de um arquivo XML passando uma lista de um objeto que possui algum atributo com set privado ocorre o seguinte erro:

"System.InvalidOperationException: 'Cannot deserialize type 'GameStore.Produto.Produtos' because it contains property 'codigoProduto' which has no public setter.'"

Ou seja, para exportar um XML os meus atributos vão ter que estar sempre com o set público? existe alguma forma de contornar isso?

Abaixo segue os códigos de apoio:

public class Produtos
    {
        public static int idProduto { get; private set; }
        public int codigoProduto { get; private set; }
        public string nome { get; private set; }
        public double valor { get; private set; }
        public Produtos(string nome, double valor)
        {
            this.nome = nome;
            this.valor = valor;

            idProduto++;
            this.codigoProduto = idProduto;
        }        

        private Produtos ()
        {

        }

        public override string ToString()
        {
            return $"| ▓▓▓▓▓▓▓▓▓ --- PRODUTO --- ▓▓▓▓▓▓▓▓▓ | \n" +
                   $"| Código: {this.codigoProduto} \n" +
                   $"| Nome: {this.nome} \n" +
                   $"| Valor: {this.valor}";                   
        }
    }
private static void ExportData(string caminho, FormatoArquivos formato, List<T> dados)
        {
            if (formato == FormatoArquivos.Xml)
            {
                //Serializar para XML      
                var serializar = new XmlSerializer(typeof(List<T>));
                try
                {
                    FileStream fs = new FileStream(caminho + "\\dados.xml", FileMode.Create);
                    using (StreamWriter streamwriter = new StreamWriter(fs))
                    {
                        serializar.Serialize(streamwriter, dados);
                    }
                    Console.WriteLine($"Arquivo salvo em {caminho}");
                }
                catch (Exception excecao)
                {
                    throw new Exception(excecao.Message);
                }
            }
        }
ExportarDados<Produtos>.SalvarDados("c:\\temp", ExportarDados<Produtos>.FormatoArquivos.Xml, _listProdutos);
2 respostas
solução!

Olá Wagner!

O erro que você está enfrentando ocorre porque a classe XmlSerializer requer que todas as propriedades que serão serializadas tenham um setter público. No seu caso, a propriedade codigoProduto tem um setter privado, o que está causando o erro.

Uma forma de contornar essa situação é criar uma propriedade pública para codigoProduto e manter o setter privado apenas para uso interno na classe. Por exemplo:

public class Produtos
{
    public static int idProduto { get; private set; }
    public int codigoProduto { get; private set; }
    public string nome { get; private set; }
    public double valor { get; private set; }

    // Propriedade pública para códigoProduto
    public int CodigoProduto
    {
        get { return codigoProduto; }
        private set { codigoProduto = value; }
    }

    public Produtos(string nome, double valor)
    {
        this.nome = nome;
        this.valor = valor;

        idProduto++;
        this.codigoProduto = idProduto;
    }        

    private Produtos ()
    {

    }

    public override string ToString()
    {
        return $"| ▓▓▓▓▓▓▓▓▓ --- PRODUTO --- ▓▓▓▓▓▓▓▓▓ | \n" +
               $"| Código: {this.codigoProduto} \n" +
               $"| Nome: {this.nome} \n" +
               $"| Valor: {this.valor}";                   
    }
}

Dessa forma, você poderá utilizar a propriedade CodigoProduto para serializar e deserializar o objeto Produtos sem problemas.

Espero ter ajudado e bons estudos!

Boa tarde André !

Perfeito, obrigado pela ajuda.

Abraço.