varsayalım:Protobuf-net, değişmez değer tipleri ile nasıl kullanılır? Böyle bir değişmez değer türüne sahip
[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);
}
}
O BinaryFormatter veya DataContractSerializer ile çalışır ama protobuf-net ile kullanmaya çalıştığınızda (http://code.google.com/p/protobuf-net/) seri hale getirici bu hatayı alıyorum:
Cannot apply changes to property ConsoleApplication.Program+MyValueType.X
DataMember özniteliğiyle işaretlenen özelliklere set uygularsam işe yarayacaktır, ancak bu değer tipinin değişmezliğini bozar ve bu bizim için arzu edilmez.
Çalışmak için ne yapmam gerektiğini bilen var mı? Ben bir SerializationInfo ve bir StreamingContext alır, ancak bunları ISerializable arabirimini uygulama bağlam dışında kullanmıyorum ProtoBu.Serializer.Serialize yöntemi bir aşırı yük olduğunu fark ettim, bu nedenle bunları kullanmak için herhangi bir kod örnekleri Bu bağlam çok takdir edilecektir!
sayesinde
DÜZENLEME: bu yüzden bazı eski MSDN makalesine kazılıp ve SerializationInfo ve StreamingContext kullanılır ve nasıl daha iyi anlaşılmasını var, ama bunu yapmak için çalıştım:
var serializationInfo = new SerializationInfo(
typeof(MyValueType), new FormatterConverter());
ProtoBuf.Serializer.Serialize(serializationInfo, valueType);
Serialize<T>
yönteminin yalnızca referans türlerine izin verdiğini ortaya çıkarır, bunun için belirli bir neden var mı? Referans tipi ile maruz bırakılan değer tiplerini serileştirebileceğim için biraz garip görünüyor.
Gecikme için üzgünüz - telaşlı bir hafta sonu –