Supposons que j'ai un type de valeur immuable comme celui-ci :
[Serializable]
[DataContract]
public struct MyValueType : ISerializable
{
private readonly int _x;
private readonly int _z;
public MyValueType(int x, int z)
: this()
{
_x = x;
_z = z;
}
// this constructor is used for deserialization
public MyValueType(SerializationInfo info, StreamingContext text)
: this()
{
_x = info.GetInt32("X");
_z = info.GetInt32("Z");
}
[DataMember(Order = 1)]
public int X
{
get { return _x; }
}
[DataMember(Order = 2)]
public int Z
{
get { return _z; }
}
public static bool operator ==(MyValueType a, MyValueType b)
{
return a.Equals(b);
}
public static bool operator !=(MyValueType a, MyValueType b)
{
return !(a == b);
}
public override bool Equals(object other)
{
if (!(other is MyValueType))
{
return false;
}
return Equals((MyValueType)other);
}
public bool Equals(MyValueType other)
{
return X == other.X && Z == other.Z;
}
public override int GetHashCode()
{
unchecked
{
return (X * 397) ^ Z;
}
}
// this method is called during serialization
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("X", X);
info.AddValue("Z", Z);
}
public override string ToString()
{
return string.Format("[{0}, {1}]", X, Z);
}
}
Il fonctionne avec BinaryFormatter ou DataContractSerializer mais lorsque j'essaie de l'utiliser avec protobuf-net ( http://code.google.com/p/protobuf-net/ ) sérialiseur j'obtiens cette erreur :
Impossible d'appliquer les modifications à la propriété ConsoleApplication.Program+MyValueType.X
Si j'applique des setters aux propriétés marquées de l'attribut DataMember, cela fonctionnera mais cela rompt l'immuabilité de ce type de valeur et ce n'est pas souhaitable pour nous.
Quelqu'un sait-il ce que je dois faire pour que ça marche ? J'ai remarqué qu'il y a une surcharge de la méthode ProtoBu.Serializer.Serialize qui prend un SerializationInfo et un StreamingContext mais je ne les ai pas utilisés en dehors du contexte de l'implémentation de l'interface ISerializable, donc tout exemple de code sur la façon de les utiliser dans ce contexte sera très apprécié !
Merci,
EDIT : j'ai donc déterré un vieil article de MSDN et j'ai mieux compris où et comment SerializationInfo et StreamingContext sont utilisés, mais lorsque j'ai essayé de faire ceci :
var serializationInfo = new SerializationInfo(
typeof(MyValueType), new FormatterConverter());
ProtoBuf.Serializer.Serialize(serializationInfo, valueType);
il s'avère que le Serialize<T>
ne permet que les types de référence, y a-t-il une raison particulière à cela ? Cela semble un peu étrange étant donné que je suis capable de sérialiser les types de valeur exposés par un type de référence.