【问题标题】:Creating objects and object serialization in C#在 C# 中创建对象和对象序列化
【发布时间】:2019-11-03 21:55:03
【问题描述】:

我是 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 对象,因为我们不只有一个联系人。但是,如果我重新创建一个对象,我的序列化程序只会获取最后一个创建的对象,我想恢复所有对象。

【问题讨论】:

  • 但我希望有几个 Person 对象 ...这并不反映您的标题。您的问题与构造对象无关。它与文件的序列化有关。
  • 嗨,Rayane。对于可维护的代码,我建议您用英文编写代码 - 变量名和 cmets。我假设您的意思是序列化/反序列化 Person 列表,而不是 Person。
  • 是的,对不起,我错了,但我都需要。
  • 这里有一些条件场景需要考虑,主要与文件是否存在以及您是要附加数据还是写入整个数据集合有关。它也与格式化程序有关。对于BinaryFormatter,我不确定集合\数据数组的概念是否存储在文件中。如果这是一个文件,其中每个换行符代表一条新记录,您只需将数据附加到文件末尾的新行上,可以这么说。因此,这里需要考虑流位置、格式以及所需的操作和处理。

标签: c# file class object


【解决方案1】:

您可以创建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.");
    } 
}

更新: 您应该考虑设计文件结构(合同如何放置在文件中)。我不确定您的序列化是否提供了从文件中检索记录所需的所有数据。无论如何,现在写入文件应该没问题了。

【讨论】:

  • 一定是它!一个列表!谢谢我没想到我会看到!
  • 嗯,如何在知道以另一种形式初始化的内容的情况下将值添加到列表中?公共列表 联系人 { 获取;放; }
  • 非常感谢!而要反序列化数据,我应该怎么做呢?
  • 哦不,这是个错误:(
  • 我不确定 OP 想要一个文件为每个合同提供一个文件,还是为所有合同提供一个文件。无论如何,我会尽快更新答案。
【解决方案2】:

关于我的评论,这里有几件事需要考虑(因此它的几个实现与这些考虑有关)。


此答案将在 List&lt;Personee&gt; 类型上使用反序列化和序列化,并在序列化之前有条件地检查文件是否存在。

模拟数据

[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条。

【讨论】:

  • 这里的static 函数用法反映了我的测试设置。这不是对您实施的建议或建议。
【解决方案3】:

试试这个

使用系统;

命名空间 NewOperator {

类矩形{

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; 
} 

}

// 驱动类 类程序 {

// 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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2013-02-10
    • 1970-01-01
    • 2012-09-12
    相关资源
    最近更新 更多