Comment BinaryFormatter.Désérialiser créer de nouveaux objets?

Quand BinaryFormatter désérialise un flux de données dans des objets, il semble pour créer de nouveaux objets sans appel des constructeurs.

Comment est-il fait cela? Et pourquoi? Est-il rien d'autre dans .NET qui fait cela?

Voici une démo:

[Serializable]
public class Car
{
    public static int constructionCount = 0;

    public Car()
    {
        constructionCount++;
    }
}

public class Test
{
    public static void Main(string[] args)
    {
        //Construct a car
        Car car1 = new Car();

        //Serialize and then deserialize to create a second, identical car
        MemoryStream stream = new MemoryStream();
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(stream, car1);
        stream.Seek(0, SeekOrigin.Begin);
        Car car2 = (Car)formatter.Deserialize(stream);

        //Wait, what happened?
        Console.WriteLine("Cars constructed: " + Car.constructionCount);
        if (car2 != null && car2 != car1)
        {
            Console.WriteLine("But there are actually two.");
        }
    }
}

De sortie:

Cars constructed: 1

But there are actually two.

  • Bonne question. Pour contourner ce problème, vous aurez besoin de faire quelques pointeur/référence corrections lors de la désérialisation, ce qui peut être difficile ou même impossible. Remarque le fait, que new Car a été appelé une fois. Vous pourriez veux essayer ce dans les 2 processus.
  • double possible de DataContractSerializer ne pas appeler mon constructeur ??
  • Remarque: L'autre question, je lien est sur le DataContractSerializer, mais l'explication est la même pour BinaryFormatter
  • Merci, cela répond-il. FormatterServices.GetUninitializedObject() est bizarre.
InformationsquelleAutor Joe Daley | 2010-08-17