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

null , . , null null:

if(value == null) return null;

, , , " , null null ".

+1

All Articles