私はこのような不変の値型を持っていると仮定します。protobuf-netを不変の値型で使用する方法は?
[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);
}
}
それはにBinaryFormatterまたはDataContractSerializerで動作しますが、私がいるProtobufネット(http://code.google.com/p/protobuf-net/)シリアライザとそれを使用しようとすると、私はこのエラーを取得:
Cannot apply changes to property ConsoleApplication.Program+MyValueType.X
DataMember属性でマークされたプロパティにsetterを適用すると、それは機能しますが、この値型の不変性が破られ、それは私たちにとって望ましくありません。
誰かが私がそれを稼働させるために必要なことを知っていますか?私は、SerializationInfoとStreamingContextを取り込むProtoBu.Serializer.Serializeメソッドのオーバーロードがあることに気付いていますが、ISerializableインターフェイスを実装するコンテキスト外では使用していないので、それらを使用する方法に関するコード例この文脈は非常に高く評価されるでしょう!
おかげで、
編集:私はいくつかの古いMSDNの記事を掘っ、どこで、どのようにしたSerializationInfoとStreamingContextが使用されているのより良い理解を得たが、私はこれを行うにしようとしたとき:
var serializationInfo = new SerializationInfo(
typeof(MyValueType), new FormatterConverter());
ProtoBuf.Serializer.Serialize(serializationInfo, valueType);
をSerialize<T>
メソッドで参照型のみが許可されていることが判明しましたが、それには特別な理由がありますか?参照型で公開されている値の型をシリアル化することができれば、ちょっと変わったようです。
- 多忙な週末 –