Je travaille sur le projet écrit sur C#
avec protobuf-net
. J'ai un code sérialisant/désérialisant Dictionary<MyClass1, MyClass2>
dans le fichier. En outre, j'ai un fichier avec des données sérialisées. Lorsque je tente de le désérialiser, je reçois une exception key
ne peut pas être null
. Je ne comprends pas comment est-il possible puisque Dictionary
ne permet pas null
, il semble que je ne pouvais pas sérialiser un tel dictionnaire. Je pense que le fichier a été corrompu, mais je ne suis pas sûr. J'ai essayé de le déboguer, et semble que quelques clés et valeurs ont été désérialisées correctement, mais au milieu du processus de désérialisation, la clé null
s'est produite et je vois l'exception. J'ai essayé d'utiliser substitut pour ProductName
comme mentionné here mais cela n'aide pas.Protobuf dictionnaire désérialisation jette une exception de clé nulle
Comment désérialiser ce fichier? Peut-il y avoir un moyen de désérialiser certains objets au lieu de null
pour ProductName
?
Exception:
System.ArgumentNullException: La valeur ne peut être nulle. Nom du paramètre: touche à System.Collections.Generic.Dictionary
2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary
2.System.Collections.Generic.ICollection> .Add (KeyValuePair`2 KeyValuePair) à proto_10 (Object, ProtoReader) à ProtoBuf.Meta.TypeModel.DeserializeCore (Lecteur ProtoReader, Type de type, Valeur d'objet, Boolean noAutoCreate) dans c: \ Dev \ protobuf-net \ protobuf-net \ Meta \ TypeModel.cs: ligne 704 à ProtoBuf.Meta.TypeModel.Deserialize (Source de flux, Valeur d'objet , Type Type, contexte SerializationContext) dans c: \ Dev \ protobuf-net \ protobuf-net \ Meta \ TypeModel.cs: ligne 588 à ProtoBuf.Serializer.Deserialize [T] (source de flux) dans c: \ Dev \ protobuf -net \ protobuf-net \ Serializer.cs: ligne 77
code:
[ DataContract ]
public sealed class ProductName
{
[ DataMember(Order = 1) ]
public string Name { get; private set; }
public static readonly ProductName Undefined = Create("Unknown");
private ProductName()
{
}
private ProductName(string Name)
{
this.Name = Name.Trim();
}
public static ProductName Create(string Name)
{
Condition.Requires(Name, "Name").IsNotNullOrEmpty();
return new ProductName(Name);
}
public static ProductName TryCreate(string Name)
{
return Name.IsValidName() ? new ProductName(Name) : null;
}
public override string ToString()
{
return this.Name;
}
public override int GetHashCode()
{
var stableHashCodeIgnoringCase = this.Name.GetStableHashCodeIgnoringCase();
return stableHashCodeIgnoringCase;
}
#region Equality members
public bool Equals(ProductName other)
{
if(ReferenceEquals(null, other))
return false;
if(ReferenceEquals(this, other))
return true;
return string.Equals(this.Name, other.Name, StringComparison.InvariantCultureIgnoreCase);
}
public override bool Equals(object obj)
{
if(ReferenceEquals(null, obj))
return false;
if(ReferenceEquals(this, obj))
return true;
if(obj.GetType() != this.GetType())
return false;
return this.Equals((ProductName)obj);
}
#endregion
}
[ DataContract ]
public class ProductNameIndex
{
[ DataMember(Order = 1) ]
public IDictionary< ProductName, ProductId > Products{ get; private set; }
public ProductNameIndex()
{
this.Products = new Dictionary< ProductName, ProductId >();
}
}