Лучший отвечающий
Как не сериализовывать некоторые свойства класса. C#

Вопрос
-
Здравствуйте.
При попытке сериализовать ниже приведённый класс столкнулся с ошибкой {"При сериализации объекта типа 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