Comment puis-je sérialiser un objet qui a une interface comme une propriété?
J'ai 2 interfaces IA et IB.
public interface IA
{
IB InterfaceB { get; set; }
}
public interface IB
{
IA InterfaceA { get; set; }
void SetIA(IA value);
}
Chacune des interfaces de références de l'autre.
Je suis en train de sérialiser ClassA comme défini ci-dessous.
[Serializable]
public class ClassA : IA
{
public IB InterfaceB { get; set; }
public ClassA()
{
//Call outside function to get Interface B
IB interfaceB = Program.GetInsanceForIB();
//Set IB to have A
interfaceB.SetIA(this);
}
}
[Serializable]
public class ClassB : IB
{
public IA InterfaceA { get; set; }
public void SetIA(IA value)
{
this.InterfaceA = value as ClassA;
}
}
J'ai une erreur quand j'essaie trop sérialiser parce que le 2 propriétés sont des interfaces. Je veux sérialiser les propriétés.
Comment contourner ce problème?
J'ai besoin d'avoir des références dans chaque interface à l'autre. Et j'ai besoin d'être en mesure de sérialiser la classe d'avant en arrière.
OriginalL'auteur David Basarab | 2009-05-04
Vous devez vous connecter pour publier un commentaire.
Vous disposez de plusieurs bugs dans votre code, sinon ce serait très bien fonctionner.
ClassA
, vous êtes en paramètre une variable locale de l'IB, et non pas de l'objet de l'IB objet.ClassB
, vous êtes casting de revenir à l'objet de la classe de béton, au lieu de le laisser seul, comme le type d'interface.Voici ce que votre code devrait ressembler à:
Ouais. Il est facile d'obtenir le copier-coller des erreurs. Content que cela a aidé.
OriginalL'auteur Erich Mirabal
Mettre en œuvre ISerializable sur vos objets à contrôler la sérialisation.
OriginalL'auteur Greg
En supposant que vous ne voulez pas sérialiser l'interface de la propriété, de la place de l'attribut suivant
sur l'interface de la propriété.
Vous pouvez le faire avec un custom sérialiseur/deserializer. Dans votre personnalisé sérialiseur il vous suffit de maintenir l'ajout d'informations à propos de l'objet qui se tient dans l'interface de la propriété. Vous pouvez également éviter la circulaire de référence il n'y a pas de doute serait par le maintien d'un simple décompte de ce que vous avez sérialisé/désérialisé déjà.
OriginalL'auteur rein
En revenir à votre question: deux autres questions. Que faites-vous Sérialiser? Est la référence de base de données-connaissance?
Vous n'avez pas sérialiser des interfaces; vous sérialiser des objets. L'objet à sérialiser est soit un de la mise en œuvre de l'IA ou IB.
C'est à l'objet sérialisé pour décider si l'une des propriétés doit être sérialisé ou pas. Si la propriété ne besoin de la sérialisation, il doit implémenter l'interface Serializable.
Vous ne pouvez sérialiser un soi-disant " île "formé par une référence circulaire A <-> B si la base de données peut identifier les objets sérialisés: il doit d'abord" allouer de l'espace pour Une, début de la sérialisation d'Une de ses propriétés. Quand il arrive à B, il va trouver de l'une de ses propriétés se référant à A. La sérialisation devra inclure une référence à la version sérialisée de A.
C'est un peu comme deux connaissances mouvement des maisons dans le même temps: d'abord, ils vont échanger leurs futurs adresses, alors seulement, ils pourront déplacer physiquement.
OriginalL'auteur xtofl
Les propriétés de l'Interface ne sont pas sérialisables. Toutefois, des champs de référence de ces propriétés (dans la sous-classe).
Vous aurez besoin de faire quelque chose comme ceci:
Oups. Cela était dû à une incompréhension fondamentale (de ma part) de ce qui est et n'est pas sérialisable. (J'ai été faire le mal.) Les Interfaces ne sont PAS sérialisables; propriétés dans une classe dérivée à partir d'une interface serializable. Merci pour cette remarque.
OriginalL'auteur Michael Todd