Suppose I have a following class:
public class Test {
  int x { get; set; }
  int y { get; set; }
  Vector3 coords { get; set; }
}
How can I serialize this object if I canont use [ProtoContract] and [ProtoMember(x)] attributess on Vector3 class, which comes from external assembly.
I have read How can I serialize a 3rd party type using protobuf-net or other serializers? but it is vague (for example I don't know if I can mix TypeModel and attributes approach, or how to add unknowd type member as a field to known type member if I choose to use only TypeModel approach etc.), so I need a concrete example for my situation.
For example, I declare TypeModel like this:
RuntimeTypeModel.Default.Add(typeof(Vector3), false).Add(1, "x").Add(2, "y").Add(3, "z");
RuntimeTypeModel.Default.Add(typeof(SerializableTestClass), false).Add(1, "_x").Add(2, "_y").Add(3, "_coords");
Serialization/deserialization:
if (GUILayout.Button("Serialize")) {
    SerializableTestClass testClass = new SerializableTestClass();
    testClass.changeMembers();
    RuntimeTypeModel.Default.Serialize(_serializedObject, testClass);
}
if (GUILayout.Button("Deserialize")) {
    SerializableTestClass test = (SerializableTestClass) RuntimeTypeModel.Default.Deserialize(_serializedObject, null, typeof(SerializableTestClass));
    Debug.Log("Deserialized object: " + test.ToString());
}
And when I try to serialize, I get an error:
InvalidOperationException: Duplicate field-number detected; 1 on: SerializableTestClass
UPDATE ============================
Now, I changed my code so everything looks like this: Serializable class:
[ProtoContract]
public class SerializableTestClass {
    [ProtoMember(1)]
    int _x { get; set; }
    [ProtoMember(2)]
    int _y { get; set; }
    [ProtoMember(3)]
    Vector3 _coords { get; set; }
    public SerializableTestClass() {
        Debug.Log("SerializableTestClass.ctor()");
        _x = 10;
        _y = 20;
        _coords = Vector2.one * 2;
    }
    public void changeMembers() {
        _x += -3;
        _y += 134;
        _coords *= 3;
    }
    public override string ToString() {
        return _x.ToString() + " " + _y + " " + _coords;
    }
}
Model:
_model = TypeModel.Create();
_model.Add(typeof(Vector3), false).Add(1, "x").Add(2, "y").Add(3, "z");
_model.Add(typeof(SerializableTestClass), true);
Serialization/Deserialization:
if (GUILayout.Button("Serialize")) {
    SerializableTestClass testClass = new SerializableTestClass();
    _serializedObject = new MemoryStream();
    testClass.changeMembers();
    _model.Serialize(_serializedObject, testClass);
}
if (GUILayout.Button("Deserialize")) {
    SerializableTestClass test = (SerializableTestClass) _model.Deserialize(_serializedObject, null, typeof(SerializableTestClass));
    Debug.Log("Deserialized object: " + test.ToString());
}
Output: 10 20 (2.0, 2.0, 2.0)
Should be: 7 154 (6.0, 6.0, 6.0)
 
     
    
