pizheng/protobuf-net

Member of derived type is not deserialized correctly if in constructor is instantiated to a different type having the same base

Opened this issue · 0 comments

What steps will reproduce the problem?

Following code:

  static void Main(string[] args)
        {

            MyFigure myFigure = new MyFigure();

            MyGeometryEllipse ellipse = new MyGeometryEllipse();
            myFigure.MyGeometry = ellipse;

            MemoryStream memoryStream = new MemoryStream();
            ProtoBuf.Serializer.Serialize<MyFigure>(memoryStream, myFigure);
            memoryStream.Position = 0;
            object deserialized = ProtoBuf.Serializer.Deserialize<MyFigure>(memoryStream);


       }
    }

    [ProtoContract]
    [ProtoInclude(1, typeof(MyFigure))]
    abstract class MyDrawing
    { }

    [ProtoContract]
    class MyFigure : MyDrawing
    {
        [ProtoMember(1)]

        internal MyGeometry MyGeometry { get; set; }

        internal MyFigure()
        {
            //If I do not comment the following line deserialized
            // object will have a geometry of type point regardless
            // of my assignment to ellipse
            MyGeometry = new MyGeometryPoint();
        }

    }

    [ProtoContract]
    [ProtoInclude(1, typeof(MyGeometryEllipse))]
    [ProtoInclude(2, typeof(MyGeometryPoint))]
    abstract class MyGeometry
    {}

    [ProtoContract]
    class MyGeometryEllipse : MyGeometry
    {}

    [ProtoContract]
    class MyGeometryPoint : MyGeometry
    {}

What is the expected output? What do you see instead?

I would expect the deserialized object to have MyGeometry of type 
MyGeometryEllipse


What version of the product are you using? On what operating system?

rev 444


Please provide any additional information below.

Can this be handled via attributes?

alexandru.iordan@gmail.com

Original issue reported on code.google.com by alexandr...@gmail.com on 2 Sep 2011 at 9:07