Como usar o protobuf-net com tipos de valor imutáveis?

Suponha que eu tenha um tipo de valor imutável como este:

[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);
}
}

Funciona com BinaryFormatter ou DataContractSerializer, mas quando tento usá-lo com protobuf-net http: //code.google.com/p/protobuf-net) serializador Eu recebo este erro:

Não é possível aplicar alterações à propriedade ConsoleApplication.Program + MyValueType.X

Se eu aplicar setters às propriedades marcadas com o atributo DataMember, ele funcionará, mas interromperá a imutabilidade desse tipo de valor e isso não é desejável para nó

Alguém sabe o que preciso fazer para que funcione? Percebi que há uma sobrecarga do método ProtoBu.Serializer.Serialize que recebe um SerializationInfo e um StreamingContext, mas não os uso fora do contexto de implementação da interface ISerializable, portanto, existem exemplos de código sobre como usá-los em esse contexto será muito apreciado!

Obrigado

EDIT: então, descobri um artigo antigo do MSDN e entendi melhor onde e como o SerializationInfo e o StreamingContext são usados, mas quando tentei fazer isso:

var serializationInfo = new SerializationInfo(
    typeof(MyValueType), new FormatterConverter());
ProtoBuf.Serializer.Serialize(serializationInfo, valueType);

, acontece que oSerialize<T> método @ permite apenas tipos de referência. Existe uma razão específica para isso? Parece um pouco estranho, pois sou capaz de serializar tipos de valor expostos por meio de um tipo de referênci

questionAnswers(1)

yourAnswerToTheQuestion