Objet d’écriture C # dans un fichier binary

Je dois écrire un object dans un fichier binary. Ma structure ressemble à ceci.

Struct Company { int numberofemployees list of Struct Employee. } Struct Employee { ssortingng EmployeeName; ssortingng Designation; } 

Quelle est la meilleure façon de faire l’opération ci-dessus? Cordialement Raju

À quoi voulez-vous que la sortie ressemble exactement? Vous pouvez l’écrire manuellement (voir la réponse de Lirik) ou, si vous souhaitez, un support d’exécution, par exemple, protobuf-net.

Cela serait facile à faire si vous utilisiez des classes (ce que je suppose que vous devriez en faire), mais en outre, protobuf-net v2 (disponible uniquement en tant que source pour le moment) devrait fonctionner avec “tel quel”.

Pour info, voici comment je le ferais en classe:

  public class Company { private readonly List employees = new List(); public List Employees { get { return employees;}} } public class Employee { public ssortingng EmployeeName {get;set;} public ssortingng Designation {get;set;} } 

Cela pourrait être décoré avec des atsortingbuts de sérialisation, ou (encore une fois, en utilisant protobuf-net v2) quelque chose comme ce test (qui passe):

  [Test] public void CanSerializeCompany() { var model = TypeModel.Create(); model.Add(typeof(Company), false).Add("Employees"); model.Add(typeof(Employee), false).Add("EmployeeName", "Designation"); model.ComstackInPlace(); Company comp = new Company { Employees = { new Employee { Designation = "Boss", EmployeeName = "Fred"}, new Employee { Designation = "Grunt", EmployeeName = "Jo"}, new Employee { Designation = "Scapegoat", EmployeeName = "Alex"}} }, clone; using(var ms = new MemoryStream()) { model.Serialize(ms, comp); ms.Position = 0; Console.WriteLine("Bytes: " + ms.Length); clone = (Company) model.Deserialize(ms, null, typeof(Company)); } Assert.AreEqual(3, clone.Employees.Count); Assert.AreEqual("Boss", clone.Employees[0].Designation); Assert.AreEqual("Alex", clone.Employees[2].EmployeeName); } 

(et écrit 46 octets)

Cela devrait fonctionner avec des champs privés, des structures, etc. – je devrais jeter un coup d’oeil …

Si vous pouvez append des atsortingbuts, vous n’avez pas besoin de configurer le modèle manuellement (les 4 premières lignes). Le rest du code indique simplement une utilisation complète aller-retour.

Dans ma compréhension, BinaryFormatter est l’outil pour ce travail.

Edit: Comme Marc l’explique dans les commentaires, BinaryFormatter présente certains inconvénients. Il recommande protobuf-net dans son blog.

Voici un exemple pour lire / écrire un fichier binary:

 using System; using System.IO; public class BinaryFileTest { private static void Main() { FileStream fs = new FileStream("test.dat", FileMode.Create); BinaryWriter w = new BinaryWriter(fs); w.Write(1.2M); w.Write("ssortingng"); w.Write("ssortingng 2"); w.Write('!'); w.Flush(); w.Close(); fs.Close(); fs = new FileStream("test.dat", FileMode.Open); StreamReader sr = new StreamReader(fs); Console.WriteLine(sr.ReadToEnd()); fs.Position = 0; BinaryReader br = new BinaryReader(fs); Console.WriteLine(br.ReadDecimal()); Console.WriteLine(br.ReadSsortingng()); Console.WriteLine(br.ReadSsortingng()); Console.WriteLine(br.ReadChar()); fs.Close(); } }