Создание объектов и сериализация объектов в C # - PullRequest
1 голос
/ 02 ноября 2019

Я новичок в C #, и я создал класс Person, который включает больше переменных и конструктор:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Contact
{
    [Serializable()] //On peut le sérializer    
    class Personne
    {
        //Constructeur
        public Personne(string prenom, string nom, int age, string dateNaissance, bool isMan, string notes, string pathImage, string mail, 
            string mail2, string tel, string telFix, string site, string rue, string ville, string numero, string codePostal, string departement)
        {
            Prenom = prenom;
            Nom = nom;
            Age = age;
            DateNaissance = dateNaissance;
            IsMan = isMan;
            Notes = notes;
            this.pathImage = pathImage;
            this.mail = mail;
            this.mail2 = mail2;
            this.tel = tel;
            this.telFix = telFix;
            this.site = site;
            this.rue = rue;
            this.ville = ville;
            this.numero = numero;
            this.codePostal = codePostal;
            this.departement = departement;
        }

        public override string ToString()
        {
            return base.ToString();
        }

        //Variables
        public string Prenom { get; set; }
        public string Nom { get; set; }
        public int Age { get; set; }
        public string DateNaissance { get; set; }
        public bool IsMan { get; set; }
        public string Notes { get; set; }
        public string pathImage { get; set; }
        public string mail { get; set; }
        public string mail2 { get; set; }
        public string tel { get; set; }
        public string telFix { get; set; }
        public string site { get; set; }
        public string rue { get; set; }
        public string ville { get; set; }
        public string numero { get; set; }
        public string codePostal { get; set; }
        public string departement { get; set; }
    }
}

Создание объекта этого класса выполняется здесь, при нажатии кнопки. в моей форме:

private void Btn_valider_Click(object sender, EventArgs e)
{

                //Création de l'objet
                Personne contact = new Personne(Prenom, Nom, Age, dateNaissanceStr, isMan, notesStr, pathImage, mail, mail2, tel, telFix,
                    site, rue, ville, numero, codePostal, departement);

                //Sauvegarde l'objet
                Stream fichier = File.Create(@"contact.dat");
                BinaryFormatter serializer = new BinaryFormatter();
                serializer.Serialize(fichier, contact);
                fichier.Close();

                this.Close();
            }
            catch
            {
                MessageBox.Show("Erreur.");
            }
        }
    }
}

Итак, как мы видим, я создаю контактный объект (я создаю менеджер контактов), но я бы хотел, чтобы было несколько объектов Person, потому что у нас неттолько один контакт. Но если я воссоздаю объект, мой сериализатор берет только последний созданный объект, и я хотел бы восстановить ВСЕ объекты.

Ответы [ 3 ]

2 голосов
/ 02 ноября 2019

Вы можете создать List<Personne> и сохранить их в файле с помощью цикла foreach.
Ваш метод "Btn_valider_Click" будет выглядеть примерно так:

private void Btn_valider_Click(object sender, EventArgs e)
{
        var personList = new List<Personne>();

        //Création de l'objet
        Personne contact = new Personne(Prenom, Nom, Age, dateNaissanceStr, isMan, notesStr, pathImage, mail, mail2, tel, telFix,
            site, rue, ville, numero, codePostal, departement);

        personList.Add(contact);
        //Adding other persons


        foreach(var cont in personList)
        {
            //Sauvegarde l'objet
            Stream fichier = File.OpenWrite(@"contacts.dat");
            BinaryFormatter serializer = new BinaryFormatter();
            serializer.Serialize(fichier, cont);
            fichier.Close();
        }

        this.Close();
    }
    catch
    {
        MessageBox.Show("Erreur.");
    } 
}

ОБНОВЛЕНИЕ: Вы должны рассмотреть вопрос о разработке структуры файла (как контракты размещаются в файле). Я не уверен, что ваша сериализация предоставляет все данные, необходимые для извлечения записей из файла. В любом случае, запись в файл должна быть в порядке.

1 голос
/ 02 ноября 2019

Что касается моего комментария, здесь следует рассмотреть несколько вещей (и, следовательно, несколько реализаций в нем относятся к этим соображениям).


В этом ответе будут использоваться десериализация и сериализация на List<Personee> тип с условными проверками того, существует ли файл перед сериализацией.

Макетные данные

[Serializable]
public class Personee
{
    public string Prenom { get; set; }
    public string Nom { get; set; }
    public int Age { get; set; }
    public string DateNaissance { get; set; }
    public bool IsMan { get; set; }
    public string Notes { get; set; }
    public string pathImage { get; set; }
    public string mail { get; set; }
    public string mail2 { get; set; }
    public string tel { get; set; }
    public string telFix { get; set; }
    public string site { get; set; }
    public string rue { get; set; }
    public string ville { get; set; }
    public string numero { get; set; }
    public string codePostal { get; set; }
    public string departement { get; set; }
}

public static string FilePath = @"contacts.dat";

public static void RunSample()
{
    Button_Click(null, null);
}

Пример

public static void Button_Click(object sender, EventArgs args)
{
    var personee = new Personee
    {
        Prenom = "Prenom",
        Nom = "Nom",
        Age = 21,
        DateNaissance = "DateNaissance",
        IsMan = true,
        Notes = "Notes",
        pathImage = "pathImage",
        mail = "mail",
        mail2 = "mail2",
        tel = "tel",
        telFix = "telFix",
        site = "site",
        rue = "rue",
        ville = "ville",
        numero = "numero",
        codePostal = "codePostal",
        departement = "department"
    };

    SeralizePersoneeDataFile(personee);
}

public static void SeralizePersoneeDataFile(Personee personee)
{
    SeralizePersoneeDataFile(new Personee[] { personee });
}

public static void SeralizePersoneeDataFile(IEnumerable<Personee> personees)
{
    var personeeDataList = (File.Exists(FilePath))
        ? DeseralizePersoneeDataFile()
        : new List<Personee>();

    personeeDataList.AddRange(personees);

    using (FileStream fichier = File.OpenWrite(FilePath))
    {
        BinaryFormatter serializer = new BinaryFormatter();
        serializer.Serialize(fichier, personeeDataList);
    }
}

public static List<Personee> DeseralizePersoneeDataFile()
{
    using (FileStream fichier = File.OpenRead(FilePath))
    {
        BinaryFormatter serializer = new BinaryFormatter();
        return (serializer.Deserialize(fichier) as List<Personee>);
    }
}

Здесь необходима десериализация перед сериализацией, поскольку эта реализация сериализации записывает все содержимое в файл (не добавляется),То есть, если у вас есть 100 контактов в файле данных, а затем просто записать 1 запись таким образом, он очистит файл и сохранит только 1.

0 голосов
/ 03 ноября 2019

Попробуйте

с помощью системы;

пространство имен NewOperator {

class Rectangle {

public int length, breadth; 

// Parameterized Constructor 
// User defined 
public Rectangle(int l, int b) 
{ 
    length = l; 
    breadth = b; 
} 

// Method to Calculate Area 
// of the rectangle 
public int Area() 
{ 
    return length * breadth; 
} 

}

// Класс класса драйвера Program {

// Main Method 
static void Main(string[] args) 
{ 
    // Creating an object using 'new' 
    // Calling the parameterized constructor 
    // With parameters 10 and 12 
    Rectangle rect1 = new Rectangle(10, 12); 

    // To display are of the Rectangle 
    int area = rect1.Area(); 
    Console.WriteLine("The area of the"+ 
               " Rectangle is " + area); 
} 

}}

Я нашел это здесь: https://www.geeksforgeeks.org/different-ways-to-create-an-object-in-c-sharp/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...