Saya mencoba menyimpan dan membaca banyak objek dalam satu File XML.

Fungsi Serialize tidak berfungsi dengan Daftar saya yang ada, tetapi saya tidak tahu mengapa. Saya sudah mencoba mengkompilasinya tetapi saya mendapatkan kesalahan yang mengatakan, bahwa metode tersebut membutuhkan referensi objek.

Program.cs:

    class Program
    {
        static void Main(string[] args)
        {
            List<Cocktail> lstCocktails = new List<Cocktail>();
            listCocktails.AddRange(new Cocktail[]
            {
                new Cocktail(1,"Test",true,true,
                new Cocktail(1, "Test4", true, true, 0)
        });


            Serialize(lstCocktails);

        }

        public void Serialize(List<Cocktail> list)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List<Cocktail>));
            using (TextWriter writer = new StreamWriter(@"C:\Users\user\Desktop\MapSample\bin\Debug\ListCocktail.xml"))
            {
                serializer.Serialize(writer, list);
            }
        }

        private void DiserializeFunc()
        {
            var myDeserializer = new XmlSerializer(typeof(List<Cocktail>));
            using (var myFileStream = new FileStream(@"C:\Users\user\Desktop\MapSample\bin\Debug\ListCocktail.xml", FileMode.Open))
            {
                ListCocktails = (List<Cocktail>)myDeserializer.Deserialize(myFileStream);
            }
        }

Koktail.cs:

    [Serializable()]
    [XmlRoot("locations")]
    public class Cocktail
    {

        [XmlElement("id")]
        public int CocktailID { get; set; }
        [XmlElement("name")]
        public string CocktailName { get; set; }
        [XmlElement("alc")]
        public bool alcohol { get; set; }
        [XmlElement("visible")]
        public bool is_visible { get; set; }
        [XmlElement("counter")]
        public int counter { get; set; }
        private XmlSerializer ser;

        public Cocktail() {
            ser = new XmlSerializer(this.GetType());
        }
        public Cocktail(int id, string name, bool alc,bool vis,int count)
        {
            this.CocktailID = id;
            this.CocktailName = name;
            this.alcohol = alc;
            this.is_visible = vis;
            this.counter = count;
        }
    }
}

Saya juga berpikir saya mengacaukan sesuatu dengan DiserializeFunc().

1
Daniel Bucher 10 Maret 2017, 09:17

2 jawaban

Jawaban Terbaik

Anda sangat dekat untuk mengimplementasikan kelas Cocktail dengan benar, tetapi saya pikir Anda bingung tentang cara membuat serialisasi Daftar. Implementasi kelas objek Cocktail Anda benar-benar baik-baik saja, singkirkan saja daftar fungsi terkait.

using System;
using System.Xml.Serialization;

namespace Serialization_Help
{
    [Serializable()]
    [XmlRoot("locations")]
    public class Cocktail
    {

        [XmlElement("id")]
        public int CocktailID { get; set; }
        [XmlElement("name")]
        public string CocktailName { get; set; }
        [XmlElement("alc")]
        public bool alcohol { get; set; }
        [XmlElement("visible")]
        public bool is_visible { get; set; }
        [XmlElement("counter")]
        public int counter { get; set; }
        public Cocktail() {

        }
        public Cocktail(int id, string name, bool alc, bool vis, int count)
        {
            this.CocktailID = id;
            this.CocktailName = name;
            this.alcohol = alc;
            this.is_visible = vis;
            this.counter = count;
        }
    }
}

Sekarang di fungsi baru Anda, Anda ingin membuat serial daftar secara langsung.

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

namespace Serialization_Help
{
    class Program {
        static void Main(string[] args) {
            List<Cocktail> list = new List<Cocktail> {
                new Cocktail(01, "rum and coke", true, true, 5),
                new Cocktail(02, "water on the rocks", false, true, 3)
            };
            Serialize(list);
            List<Cocktail> deserialized = DiserializeFunc();
        }

        public static void Serialize(List<Cocktail> list) {

            XmlSerializer serializer = new XmlSerializer(typeof(List<Cocktail>));
            using (TextWriter writer = new StreamWriter(Directory.GetCurrentDirectory() + @"\ListCocktail.xml")) serializer.Serialize(writer, list);
        }

        private static List<Cocktail> DiserializeFunc() {
            var myDeserializer = new XmlSerializer(typeof(List<Cocktail>));
            using (var myFileStream = new FileStream(Directory.GetCurrentDirectory() + @"\ListCocktail.xml", FileMode.Open)) return (List<Cocktail>)myDeserializer.Deserialize(myFileStream);
        }
    }
}

Melakukannya akan mencetak output .xml berikut dengan benar:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfCocktail xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Cocktail>
    <id>1</id>
    <name>rum and coke</name>
    <alc>true</alc>
    <visible>true</visible>
    <counter>5</counter>
  </Cocktail>
  <Cocktail>
    <id>2</id>
    <name>water on the rocks</name>
    <alc>false</alc>
    <visible>true</visible>
    <counter>3</counter>
  </Cocktail>
</ArrayOfCocktail>

Ingatlah bahwa saya belum memberikan penerapan keamanan standar atau pemeriksaan nol untuk file tersebut. Anda harus memeriksa sendiri apakah file tersebut ada dengan menggunakan File.Exists(...) (lihat di sini untuk implementasi File.Exists) dan terapkan kasus try dan catch yang benar dan apa yang akan dipilih oleh kode Anda jika dijalankan menjadi kesalahan serialisasi atau input/outut.

0
Bennett Yeo 10 Maret 2017, 07:21

Sebaiknya gunakan ExtendedXmlSerializer untuk membuat serial dan deserialize.

Pemasangan Anda dapat menginstal ExtendedXmlSerializer dari nuget atau jalankan perintah berikut:

Install-Package ExtendedXmlSerializer

Serialisasi:

ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var list = new List<Cocktail>();
var xml = serializer.Serialize(list);

Deserialization

var list = serializer.Deserialize<List<Cocktail>>(xml);

Standar XML Serializer di .NET sangat terbatas.

  • Tidak mendukung serialisasi kelas dengan referensi melingkar atau kelas dengan properti antarmuka,
  • Tidak mendukung Kamus,
  • Tidak ada mekanisme untuk membaca XML versi lama,
  • Jika Anda ingin membuat serializer khusus, kelas Anda harus mewarisi dari IXmlSerializable. Ini berarti bahwa kelas Anda tidak akan menjadi kelas POCO,
  • Tidak mendukung IoC.

ExtendedXmlSerializer dapat melakukan ini dan banyak lagi.

Dukungan ExtendedXmlSerializer .NET 4.5 atau lebih tinggi dan .NET Core. Anda dapat mengintegrasikannya dengan WebApi dan AspCore.

0
Wojtpl2 10 Maret 2017, 07:32