Serializing a <T> List Using a Surrogate with Protobuf-net Exclusion
I use protobuf-net (version 2.0.0.621) and have a problem with serialization of type List, where T is my own class (it doesn't matter what it contains) and the surrogate is set to T.
The surrogate is set as follows:
ProtoBuf.Meta.RuntimeTypeModel.Default.Add(typeof(MyClass), false).SetSurrogate(typeof(MyClassSurrogate));
MyClass:
public class MyClass
{
public int Number { get; set; }
}
[ProtoContract]
MyClassSurrogate
{
[ProtoMember(1)]
public int Number { get; set; }
}
Then I create a general list of an instance of type MyClass, fill it with elements, and serialize it as follows:
ProtoBuf.Serializer.Serialize(stream, list);
The problem occurs during deserialization, I continue to get "zero" in the surrogate when the operator is implicitly converted:
static public implicit operator MyClassSurrogate(MyClass myClass)
then myClass is null.
If I remove the surrogate and decorate MyClass with prototic attributes, everything will be fine.
Can you tell me what I am doing wrong?
Thank.
+5
2
, , , :
public static implicit operator MyClassSurrogate(MyClass myClass)
{
return myClass != null ? new MyClassSurrogate { Number = myClass.Number } : null;
}
, .
MyClassSurrogate:
[ProtoContract]
public class MyClassSurrogate
{
[ProtoMember(1)]
public int Number { get; set; }
public static implicit operator MyClassSurrogate(MyClass myClass)
{
return
myClass != null
? new MyClassSurrogate { Number = myClass.Number }
: null;
}
public static implicit operator MyClass(MyClassSurrogate myClass)
{
return new MyClass { Number = myClass.Number };
}
}
/:
var model = ProtoBuf.Meta.RuntimeTypeModel.Default;
model.Add(typeof(MyClassSurrogate), true);
model.Add(typeof(MyClass), false).SetSurrogate(typeof(MyClassSurrogate));
var stream = new System.IO.MemoryStream();
var list = new List<MyClass>();
for (int x = 0; x < 10; x++) list.Add(new MyClass { Number = x });
ProtoBuf.Serializer.Serialize(stream, list);
stream.Seek(0, SeekOrigin.Begin);
var xs = ProtoBuf.Serializer.Deserialize<List<MyClass>>(stream);
foreach (var x in xs) Debug.WriteLine(x.Number);
+5