Problem with cusotm objects deserialization

2 posts, 0 answers
  1. florian
    florian avatar
    15 posts
    Member since:
    Nov 2017

    Posted 03 May 2018 Link to this post

    Hello, 

    I have some problems when I try to deserialize custom objects which implements RadDiagramShape.

    I have implemented a custom shape :

    public class MyShape : ElementShape
    {
        public override GraphicsPath CreatePath(System.Drawing.Rectangle bounds)
        {
            GraphicsPath path = new GraphicsPath();
            path.AddString("Custom", new System.Drawing.FontFamily("Arial"), 0, bounds.Width, Point.Empty, StringFormat.GenericTypographic);
            return path;
        }
    }

    And a custom diagramShape :

    public sealed class MyDiagramShape : RadDiagramShape
        {
            public MyDiagramShape()
            {
                ShapeText = "";
                ElementShape = new MyShape();
                InternalElementColor = System.Drawing.Color.LightBlue;
            }
        }
     

    I add this custom shape to my diagram:

    MyDiagramShape diagramShape = new MyDiagramShape();
    diagramShape.Position = new Telerik.Windows.Diagrams.Core.Point(100, 80);
    radDiagram1.AddShape(diagramShape);
     

    This works fine, and when I serialize, I get a XML like this: 

    <RadDiagram>
     <Shapes>
      <MyDiagramShape Type="WindowsFormsApplicationCustomShape.MyDiagramShape"
     </Shapes>
    </RadDiagram>

     

    Problems come when I try to load this XML, object instanciated are typed as RadDiagramShape and not MyDiagramShape.

    When I serialize again, the structure of the XML is like this :

    <RadDiagram>
    <Shapes>
      <RadDiagramShape Type="Telerik.WinControls.UI.RadDiagramShape"
    </Shapes>
    </RadDiagram>

     

    I don't know if it's possible to instanciate objects with their derived type like specified in the XML ?

    Thanks in advance

  2. florian
    florian avatar
    15 posts
    Member since:
    Nov 2017

    Posted 04 May 2018 Link to this post

    I have made a quick workaround.

    I manually instanciate the desired shape on ShapeDeserialized event.

    private void RadDiagram1OnShapeDeserialized(object sender, SerializationEventArgs<IShape> e)
           {
               string type = e.SerializationInfo["Type"].ToString();
               RadDiagramShape radDiagramShape = (RadDiagramShape)e.Entity;
                
               if (type == typeof(MyDiagramShape).ToString())
               {
                   MyDiagramShape shape = new MyDiagramShape();
                   shape.Shape = radDiagramShape.Shape;
                   shape.Position = radDiagramShape.Position;
                   radDiagram1.AddShape(shape);
               }
           }

     

    And I remove the redundant RadDiagramShape item 

    private void RadDiagram1OnItemsChanging(object sender, DiagramItemsChangingEventArgs e)
            {
                var addedItem = e.NewItems.FirstOrDefault();
                if (addedItem != null )
                {
                    if (addedItem.GetType() == typeof(RadDiagramShape))
                    {
                        e.Cancel = true;
                    }
                }
            }

     

    I'm not able to work both with custom and standard shapes and it's not very elegant but at least it does the job !

Back to Top