none
Как не сериализовывать некоторые свойства класса. C# RRS feed

  • Вопрос

  • Здравствуйте.

    При попытке сериализовать ниже приведённый класс столкнулся с ошибкой {"При сериализации объекта типа PlayGround.Shapes.UserLine обнаружена циклическая ссылка."}. 

     

     [Serializable()]
     public class UserLine
     {
      /// <summary>
      /// Значение параметра в пласте
      /// </summary>
      double FValue;
      public double Value { 
       get { return FValue; } 
       set
       {
        FValue = value; 
        ToRecalc(); 
       } 
      }
      /// <summary>
      /// Дельта сигма
      /// </summary>
      [NonSerialized()]
      double FdValue;
      public double dValue { get { return FdValue; } set { ToRecalc(); FdValue = value; } }
      /// <summary>
      /// 
      /// </summary>
      [NonSerialized]
      ucGround FParent;
      public ucGround Parent { set { FParent = value; } }
    
      /// <summary>
      /// Признак текущей линии (выделяется толщиной)
      /// </summary>
      protected bool FisActive = false;
      public bool isActive { get { return FisActive; } set { FisActive = value; } }
    
      protected List<PointF> FDataPoints;
      [XmlArray]
      [XmlArrayItem(typeof(PointF))]
      public IList DataPoints
      { get { return FDataPoints; } }
    
      /// <summary>
      /// Графическое представление линии, обновляется при каждой прорисовке
      /// </summary>
      System.Drawing.Drawing2D.GraphicsPath FPath;
      public System.Drawing.Drawing2D.GraphicsPath Path
      {
       get
       { return FPath; }
      }
      #region конструкторы
      public UserLine()
      {
       FDataPoints = new List<PointF>();
       FValue = 2;
      }
    
      public UserLine(ucGround prnt)
      {
       FParent = prnt;
       FDataPoints = new List<PointF>();
       FValue = 2;
      }
    
      public UserLine(ucGround prnt, PointF pnt)
      {
       FParent = prnt;
       FDataPoints = new List<PointF>();
       FValue = 2;
       FDataPoints.Add(new PointF(prnt.RealSize.Left, pnt.Y));
       FDataPoints.Add(pnt);
       FDataPoints.Add(new PointF(prnt.RealSize.Left+prnt.RealSize.Width, pnt.Y));
    
    
       FPath = new System.Drawing.Drawing2D.GraphicsPath();
       PointF[] pnts = new PointF[FDataPoints.Count];
       for (int i = 0; i < FDataPoints.Count; ++i)
        pnts[i] = FParent.TranslatePointFtoDrw(FDataPoints[i]);
       FPath.AddLines(pnts);
      }
      #endregion
    
    
      /// <summary>
      /// признак изменения объекта, что влечёт за собой необходимость пересчёта поля
      /// </summary>
      protected bool FStateChgd = true;
      /// <summary>
      /// Параметры расчёта напряжённости от объекта
      /// </summary>
      protected Tension.TensParams FParams;
      public Tension.TensParams Params
      { set { Params = value; } }
      /// <summary>
      /// Линия напряжённости
      /// </summary>
      protected Tension.TensionLine FTension;
    
    
      [NonSerialized()]
      public UserLine LnBot = null;
      [NonSerialized()]
      public UserLine LnTop = null;
     }
    

    Причём проблема не возникает, когда у меня только 1 UserLine (и, соответственно, LnBot и LnTop, указывающие на ниже- и вышележащие аналогичные линии, равны null).

    Как я понимаю, не обрабатывается атрибут [NonSerialized()], потому что при успешном сохранении одной линии в файле присутствует параметр dValue

    Подскажите, где может быть проблема? как правильно ограничить сериализуемые параметры?

     


    • Перемещено Abolmasov Dmitry 22 апреля 2011 г. 11:39 (От:Настольные ПК)
    11 апреля 2011 г. 10:33

Ответы

  • Помечайте свойства аттрибутом XmlIgnore

    Что касается циклической ссылки - попробуйте переделать LnTop и LnBot в свойства и тоже пометить их XmlIgnore аттрибутом.

    • Предложено в качестве ответа ulcerModerator 12 апреля 2011 г. 6:57
    • Помечено в качестве ответа Abolmasov Dmitry 12 апреля 2011 г. 10:48
    11 апреля 2011 г. 13:01
    Отвечающий

Все ответы

  • Помечайте свойства аттрибутом XmlIgnore

    Что касается циклической ссылки - попробуйте переделать LnTop и LnBot в свойства и тоже пометить их XmlIgnore аттрибутом.

    • Предложено в качестве ответа ulcerModerator 12 апреля 2011 г. 6:57
    • Помечено в качестве ответа Abolmasov Dmitry 12 апреля 2011 г. 10:48
    11 апреля 2011 г. 13:01
    Отвечающий
  • спасибо, заработало!

    а LnTop и LnBot у меня до этого и были свойствами... это уже в ходе экспериментов они стали просто атрибутами

    12 апреля 2011 г. 6:40