none
Проблема с сериализацией объекта RRS feed

  • Вопрос

  • Привет всем! Cнова я со своими проблемами.
    Проблема в следующем:
    При помытке сириализации массива объектов следующего типа
    [DataContract]
        public class Product : IItemStatus, IEditableObject, INotifyPropertyChanged 
        {
            //[Required(ErrorMessage = "Поле \"Ид\" обязательно для заполнения.")]
            //[Display(Name = "Ид", Description="Цифровой идентификатор модели.")]
            [DataMember]
            public int Id { get; set; }
            //[Required(ErrorMessage = "Поле \"Тип\" обязательно для заполнения.")]
            //[Display(Name = "Тип", Description = "Тип модели.")]
            [DataMember]
            public string Type { get; set; }
            //[Display(Name = "Английское название")]
            [DataMember]
            public string TypeNameEn { get; set; }
            //[Display(Name = "Русское название")]
            [DataMember]
            public string TypeNameRu { get; set; }
    
            #region Fields
            [IgnoreDataMember]
            private int _id = 0;
            [IgnoreDataMember]
            private string _type = String.Empty;
            [IgnoreDataMember]
            private string _typeNameEn = String.Empty;
            [IgnoreDataMember]
            private string _typeNameRu = String.Empty;
            #endregion
    
            public ClothingType()
            {
                //ItemStatus = ItemStatus.Inserted;
            }
    
            #region IItemStatus Members
    
            [IgnoreDataMember]
            public ItemStatus ItemStatus { get; set; }
    
            #endregion
    
            #region IEditableObject Members
    
            public void BeginEdit()
            {
                _id = Id;
                _type = Type;
                _typeNameEn = TypeNameEn;
                _typeNameRu = TypeNameRu;
            }
    
            public void CancelEdit()
            {
                Id = _id;
                Type = _type;
                TypeNameEn = _typeNameEn;
                TypeNameRu = _typeNameRu;
            }
    
            public void EndEdit()
            {
                if(ItemStatus != ItemStatus.Inserted & ItemStatus != ItemStatus.Deleted)
                    ItemStatus = ItemStatus.Updated;
                if(PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("ItemStatus"));
            }
    
            #endregion
    
            #region INotifyPropertyChanged Members
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            #endregion
        }
    

    выдаётся исключение InvalidDataContractException, сериализаци происходит в silverlight 4 сериализатором DataContractJsonSerializer.
    Где
    public interface IItemStatus
        {
            ItemStatus ItemStatus { get; set; }
        }
        public enum ItemStatus
        {
            Loaded,
            Inserted,
            Updated,
            Deleted
        }
    
    В чём может быть дело ?
    20 октября 2011 г. 15:24
    Модератор

Ответы

  • Как-же я раньше не догадался?

    public class ClientRequest<TItem>
        {
            public Type Type { get; set; }//Вот он, несериализуемый объект.
            public TItem[] Items { get; set; }
        }
    
    

    Пришлось изменить код, и рефлексить.

    • Предложено в качестве ответа PashaPash 22 октября 2011 г. 21:35
    • Помечено в качестве ответа Abolmasov DmitryModerator 24 октября 2011 г. 6:11
    21 октября 2011 г. 10:52
    Модератор

Все ответы

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

    Какое сообщение об ошибке указано в InvalidDataContractException? Как вы сериализуете данные? Посмотрите это (на Silverlight 4 никаких ошибок не было):

            private void button1_Click(object sender, RoutedEventArgs e)
            {
                Product p = new Product();
                p.Id = 4;
                p.ItemStatus = ItemStatus.Inserted;
                p.Type = "test product";
                p.TypeNameEn = "qqqq";
                p.TypeNameRu = "wwww";
    
                MemoryStream ms = new MemoryStream();
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Product));
                serializer.WriteObject(ms, p);
                byte[] bytes = ms.ToArray();
                ms.Close();
                textBlock1.Text = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
            }
    


    Для связи [mail]
    21 октября 2011 г. 6:59
    Модератор
  • Таким же способом как вы и указали.
    Но сериализую не сам массив, а экземпляр следующего типа
    public class ClientRequest<TItem>
        {
            public Type Type { get; set; }
            public TItem[] Items { get; set; }
        }
    


    где TItem указынный тип Product.

    А сообщение следующее: Type 'System.RuntimeType' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. Alternatively, you can ensure that the type is public and has a parameterless constructor - all public members of the type will then be serialized, and no attributes will be required.

    21 октября 2011 г. 8:00
    Модератор
  • Как-же я раньше не догадался?

    public class ClientRequest<TItem>
        {
            public Type Type { get; set; }//Вот он, несериализуемый объект.
            public TItem[] Items { get; set; }
        }
    
    

    Пришлось изменить код, и рефлексить.

    • Предложено в качестве ответа PashaPash 22 октября 2011 г. 21:35
    • Помечено в качестве ответа Abolmasov DmitryModerator 24 октября 2011 г. 6:11
    21 октября 2011 г. 10:52
    Модератор