2010-01-07 6 views
1

J'écris des éléments d'un type particulier dans le fichier xml sortant en utilisant IXmlSerializable. J'ai implémenté le schéma et j'écris les éléments. Le code qui suit est un exemple.Recherche de références dans IXmlSerializable

public void IXmlSerializable.WriteXml(XmlWriter writer) { 
    // Write Out Class. 
    foreach (var item in myItems) { 
    DataContractSerializer ds = new DataContractSerializer(typeof(MyType)); 
    ds.WriteObject(writer, item); 
    } 
} 

Le problème est que je MyType est déclaré en utilisant des références

[DataContract(IsReference = true)] 
public class MyType { ... 

Ainsi, lorsque l'article a déjà été écrit au xml il doit être une référence.

Comment savoir si une référence a déjà été écrite dans le fichier xml? Je suis d'avis que je dois simplement ignorer les références dont je n'ai explicitement pas le contrôle. De cette façon, je vais créer mes propres références et référencer mes propres instances.

Il s'agit clairement d'un compromis piraté car je duplique des références qui ne doivent pas être dupliquées.

Est-il possible de trouver ce qui a déjà été écrit pour voir si je peux trouver un identifiant pour l'article déjà sérialisé?

Observe

Craig.

Répondre

0

La magie "IsReference" ne fonctionne que pour les sérialisations dans un seul "épisode". Un épisode est un appel WriteObject unique.

Disons que vous deviez avoir un objet de niveau supérieur d'un certain type de haut niveau, comme ci-dessous:

[DC]  
class Container 
    { 
     [DM] 
     MyType i1 = new MyType(); 
     [DM] 
     MyType i2 = i1;; 
     [DM] 
     MyType i3 = i1; 
    } 

Maintenant, si vous deviez sérialiser une instance de conteneur par un appel à WriteObject, que est quand "ids" et "refs" entrent en jeu. Quand i1 est sérialisé, il sera sérialisé avec un ID de 1, mais quand i2 et i3 sont sérialisés, ils sont tous sérialisés avec les attributs "REF" qui pointent vers l'ID 1 de MyType.

Dans votre exemple, étant donné que chaque appel à WriteObject est un épisode distinct, chaque appel numérise l'ensemble du graphe d'objet. À moins que vous ne puissiez regrouper toutes vos instances MyType différentes dans un objet de niveau supérieur (ou même une collection), vous n'avez pas de chance. C'est ce que vous devez faire - forcez toutes les instances de MyType à être sérialisées au sein d'un même appel WriteObject de niveau supérieur.