C# - XML Serialization error

Asked

Viewed 488 times

0

I came across this error when trying to load an XML file through three scripts: One called Item, one Itemcollection, and the script to load the XML file.

Item:

using System.Collections;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;
using UnityEngine;

public class Item : MonoBehaviour {


[XmlAttribute("id")]
public string id;

[XmlAttribute("Nome")]
public string Nome;

[XmlAttribute("Preco")]
public float Preco;
}

Itemcollection

using System.Collections;
using System.Collections.Generic;
using System.Xml.Serialization;
using UnityEngine;
using System.IO;


[XmlRoot("DataBase")]
public class ItemCollection : MonoBehaviour {
    [XmlArray("Produtos")]
    [XmlArrayItem("Produto")]
    public List<Item> Produtos = new List<Item>();

    public static ItemCollection Load(string path)
    {
        TextAsset _xml_ = Resources.Load <TextAsset>(path);

        XmlSerializer serializer = new XmlSerializer(typeof(ItemCollection));

        StringReader reader = new StringReader(_xml_.text);

        ItemCollection Produtos = serializer.Deserialize(reader) as ItemCollection;

        reader.Close();

        return Produtos;
    }
}

Loader:

using System.Collections;
using System.Collections.Generic;
using System.Xml.Linq;
using UnityEngine;

public class LoadXml : MonoBehaviour {

    public const string path = "Nomes_E_Precos";

    void Start () {
        ItemCollection itemCollection = ItemCollection.Load(path);

        foreach (Item Produto in itemCollection.Produtos)
        {
            Debug.Log(Produto.Nome + Produto.id + Produto.Preco);
        }
    }


}

However, it gives me the error(in engine) in the title:

To be XML serializable, types which inherit from Ienumerable must have an implementation of Add(System.Object)

Some solution?

2 answers

0

What is happening is that the XmlSerializer expects a class that is inherited from IEnumerable, that is, store and handle collections of items. The list (List), for example, it is one of them, but its class ItemCollection (who in fact you are trying to [to]serialize) is not!

Error indicates that your class does not have the method Add, precisely because it is in the interface IEnumerable.

A possible solution is for you to (de)serialize the list directly Produtos:

public static List<Item> Load(string path)
{
    TextAsset _xml_ = Resources.Load <TextAsset>(path);

    XmlSerializer serializer = new XmlSerializer(typeof(List<Item>));

    StringReader reader = new StringReader(_xml_.text);

    List<Item> Produtos = serializer.Deserialize(reader) as List<Item>;

    reader.Close();

    return Produtos;
}

0

I have an application in Asp.net core 2.1, in which I serialize in the controller itself. Example:

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Threading.Tasks;
using System.Web.Http.Cors;
using Vendas.Api.Models;
using Vendas.Api.Service;
namespace Vendas.Api.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    [Produces("application/json")]
    [EnableCors(origins: "http://localhost:56133/api/Produto", headers: "*", methods: "*")]
    public class ProdutoController : Controller
    {
        private readonly ProdutoService _produtoService;
        public ProdutoController(ProdutoService produtoService)
        {
            _produtoService = produtoService;
        }

        [HttpGet]
        public JsonResult Get()
        {
            var produto = _produtoService.FindAll();
            return Json(produto);
        }

        [HttpGet("{id}")]
        public JsonResult Get(int id)
        {
            var produto = _produtoService.FindById(id);
            return Json(produto);
        }

        [HttpPost]
        public ActionResult<Produto> Post(Produto produto)
        {
            _produtoService.InsertAsync(produto);
            return CreatedAtAction(nameof(Get), new { id = produto.id }, produto);
        }

        [HttpDelete("{id}")]
        public ActionResult<Produto> Delete(int id)
        {
            _produtoService.Remove(id);
            return CreatedAtAction(nameof(Get), new { id = id });

        }
        [HttpPut("{id}")]
        public async Task<IActionResult> Put(int id, Produto produto)
        {
            if (id != produto.id)
            {
                return BadRequest();
            }
            try
            {
                await _produtoService.Update(produto);
            }
            catch (DbUpdateConcurrencyException)
            {
                var cs = _produtoService.FindById(id);
            }
            return CreatedAtAction(nameof(Get), new { id = id });
        }
    }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.