La sérialisation des pauses .NET 4.5
Nous avons un problème de sérialisation qui se produit seulement dans .NET 4.5 - même le code fonctionne très bien .NET 4. nous essayons de sérialiser un type héréditaire avec un peu de domaines, à la fois de base et de classe héritée sont marqués avec SerializableAttribute. Nous obtenons une exception sur le côté client de service Web en disant qu'il y avait un MethodAccessException dans le serveur , le serveur lui-même ne pas jeter des exceptions , il semble y avoir un problème dans le client, processus de sérialisation.
Il est important de noter que nous sommes en train de compiler en .NET 4 - pas .4.5
Mise à jour: Après la mise en œuvre de la ISerailize et en ignorant la propriété "Valeur" le programme ne s'exécute correctement, mais elle signifie que nous avons dû renoncer à la sérialisation de ce champ.
toute aide serait appréciée. Merci,
Omer
Les détails de l'exception:
System.Web.Services.Protocols.SoapException occurred
HResult=-2146233087
Message=System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.InvalidOperationException: There was an error generating the XML document. ---> System.MethodAccessException: Attempt by method 'Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write88_DeviceSiteTypeInfo(System.String, System.String, IOSIGHT.Info.DeviceSiteTypeInfo, Boolean, Boolean)' to access method 'IOSIGHT.Info.DeviceSiteTypeInfo.get_Value()' failed.
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write88_DeviceSiteTypeInfo(String n, String ns, DeviceSiteTypeInfo o, Boolean isNullable, Boolean needType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write1310_GetSiteTypesResponse(Object[] p)
at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer2089.Serialize(Object objectToSerialize, XmlSerializationWriter writer)
at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
--- End of inner exception stack trace ---
at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
at System.Web.Services.Protocols.SoapServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream)
at System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues)
at System.Web.Services.Protocols.WebServiceHandler.Invoke()
--- End of inner exception stack trace ---
Source=System.Web.Services
Actor=""
Lang=""
Node=""
Role=""
StackTrace:
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at IOSIGHT.BLL.localhost.IOSightWS.GetSiteTypes() in C:\IOSIGHT\Common\IOSight.BLL\Web References\localhost\Reference.cs:line 25019
at IOSIGHT.BLL.TypeBankBLL.GetSiteTypes() in C:\IOSIGHT\Common\IOSight.BLL\Entities\TypeBanksBLL.cs:line 477
InnerException:
Attaché est la base et les classes héritées de code:
Base:
[Serializable()]
public class TypeBankInfo
{
#region "Fields"
private int _id = 0;
private string _Name = string.Empty;
private string _description = string.Empty;
private object _value = null;
#endregion
#region "Constructors"
public TypeBankInfo()
{
}
public TypeBankInfo(int ID, string name)
: this()
{
this._id = ID;
this.Name = name;
}
public TypeBankInfo(int ID, string name, string description)
: this(ID, name)
{
this._description = description;
this._value = Value;
}
public TypeBankInfo(int ID, string name, string description, object value)
: this(ID, name, description)
{
this._value = value;
}
#endregion
#region "Properties"
public virtual string Name
{
get
{
return this._Name;
}
set
{
this._Name = value;
}
}
public virtual string Description
{
get
{
return _description;
}
set
{
_description = value;
}
}
public virtual int ID
{
get
{
return _id;
}
set
{
_id = int.Parse(value.ToString());
}
}
public virtual object @Value
{
get
{
return this._value;
}
set
{
this._value = value;
}
}
#endregion
}
Intheried:
[Serializable()]
public class DeviceSiteTypeInfo : TypeBankInfo, ISerializable
{
#region "Fields"
private EntityTypeEnum _entitytype = EntityTypeEnum.Site;
private DeviceIOTemplateInfo[] _IOTemplates;
private CaptionInfo[] _Captions;
private int _parentClassID;
#endregion
#region "Constructors"
public DeviceSiteTypeInfo()
{
}
public DeviceSiteTypeInfo(int id, string name)
: base(id, name)
{
}
public DeviceSiteTypeInfo(int id, string name, string description)
: base(id, name, description)
{
}
//The special constructor is used to deserialize values.
public DeviceSiteTypeInfo(SerializationInfo info, StreamingContext context)
{
//parent fields
ID = (int)info.GetValue("_id", typeof(int));
Name = (string)info.GetValue("_Name", typeof(string));
Description = (string)info.GetValue("_description", typeof(string));
//my fields
_entitytype = (EntityTypeEnum)info.GetValue("_entitytype", typeof(EntityTypeEnum));
_IOTemplates = (DeviceIOTemplateInfo[])info.GetValue("_IOTemplates", typeof(DeviceIOTemplateInfo[]));
_Captions = (CaptionInfo[])info.GetValue("_Captions", typeof(CaptionInfo[]));
_parentClassID = (int)info.GetValue("_parentClassID", typeof(int));
}
#endregion
#region "Properties"
public EntityTypeEnum EntityTypeID
{
get
{
return this._entitytype;
}
set
{
this._entitytype = value;
}
}
[EditorBrowsable(EditorBrowsableState.Never), Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
private new object Value
{
get
{
return base.Value;
}
set
{
base.Value = value;
}
}
public CaptionInfo[] Captions
{
get
{
return this._Captions;
}
set
{
this._Captions = value;
}
}
public DeviceIOTemplateInfo[] IOTemplates
{
get
{
return this._IOTemplates;
}
set
{
this._IOTemplates = value;
}
}
public int ParentClassID
{
get
{
return this._parentClassID;
}
set
{
this._parentClassID = value;
}
}
#endregion
#region Methods
///<summary>
///Called on serialization
///</summary>
///<param name="info">serialiation info</param>
///<param name="context">context</param>
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
//parent fields
info.AddValue("_id", ID, typeof(int));
info.AddValue("_Name", Name, typeof(string));
info.AddValue("_description", Description, typeof(string));
//my fields
info.AddValue("_entitytype", _entitytype, typeof(EntityTypeEnum));
info.AddValue("_IOTemplates", _IOTemplates, typeof(DeviceIOTemplateInfo[]));
info.AddValue("_Captions", _Captions, typeof(CaptionInfo[]));
info.AddValue("_parentClassID", _parentClassID, typeof(int));
}
#endregion
}
OriginalL'auteur omer schleifer | 2013-02-04
Vous devez vous connecter pour publier un commentaire.
En 4.5, la mise en œuvre de XmlSerializer a été remplacée par une autre qui n'est pas dépendant du compilateur C#. Bien qu'il offre de meilleures performances de démarrage et de la stabilité, vous pourriez être en cours d'exécution dans un problème de compatibilité entre les implémentations. Pouvez-vous essayer d'ajouter les éléments suivants à votre application.le fichier de configuration et voir si cela résout le problème?
Si vous êtes préoccupés par le fait que ce travail sur l'4.0, vous pouvez essayer de détecter la version du cadre au moment de l'exécution, et de modifier dynamiquement la configuration si le moteur d'exécution est de 4.5 ou supérieur. J'ai écrit un billet de blog, un retour tout en expliquant comment faire:
http://blogs.msdn.com/b/youssefm/archive/2010/01/21/how-to-change-net-configuration-files-at-runtime-including-for-wcf.aspx
Êtes-vous sûr que ce n'est pas applicable? Même si vous compilez pour .Net 4.0, votre code ne fait exécuter .Net 4.5, si il est installé.
Merci à vous , cela ne l'aide. il empêche également le visual studio crash qui est créé par le même problème de sérialisation dans les sessions de débogage , sur le côté serveur. Cependant, puisque nous sommes en train de compiler en .NET 4 , et ce code est sous contrôle de code source , de n'importe quel ordinateur pas moins .Net 4.5 ne parvient pas à charger le fichier de configuration. en va de même pour les clients qui n'avaient pas installer le .NET framework 4.5
J'ai mis à jour la réponse. Vous pouvez détecter si 4.5 est installé avec cette réponse: stackoverflow.com/questions/199080/.... Vous pourriez également être en mesure de vérifier la version mineure de mscorlib.
OriginalL'auteur Youssef Moussaoui
Nous sommes à la recherche pour répondre à cette question dans les prochains .NET Framework 4.5 mise à Jour. Je vais mettre à jour le post avec le lien de téléchargement dès que la mise à jour est publiée. Veuillez contacter netfx45compat à Microsoft dot com si vous avez des critiques de la mission de l'app qui est affecté, et correctif est nécessaire de toute urgence. Je peux vous aider à Microsoft de soutien qui peuvent vous aider avec votre demande.
OriginalL'auteur Varun
J'ai eu aussi une telle erreur de sérialisation. Dans mon cas, cela a été causé par une incompatibilité de type de la
[DefaultValue(..)]
attributs. J'ai eu un attaché valeur par défaut de"1.0d"
(un double) pour une propriété de typedecimal
. Il semble que la nouvelle de la mise en œuvre de la XmlSerializer ne pouvez pas convertir ces valeurs, mais plus le vieux le pourrait. Il y a aussi l'option permettant de revenir à l'ancienne version de XmlSerializer par l'ajout d'un attribut dans l'Application.config' mais ce n'est pas recommandé par Microsoft (et moi aussi). Espérons que cela aide quelqu'un.OriginalL'auteur AndresRohrAtlasInformatik
J'ai regardé vos types de plus près, le problème est probablement provoqué par un conflit entre:
sur la Base et:
sur la classe Dérivée. Voici deux choses que je voudrais essayer:
OriginalL'auteur Youssef Moussaoui