Адаптеры таблиц не помечены как сериализуемые? - PullRequest
0 голосов
/ 07 февраля 2011

У меня есть 2 таблицы в базе данных, затем я использую модель данных в Visual Studio (наборы данных), затем использую 2 класса для хранения методов и свойств этих 2 таблиц.

Я хочу сохранить информацию, собранную из веб-формы, в список, но по какой-то причине при попытке добавить список в просмотр состояния я получаю эту ошибку:

Тип '"". "" TableAdapters. "" TableAdapter' в сборке '"", Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null' не помечен как сериализуемый.

Я уже пометил класс как сериализуемый, но теперь табличные адаптеры? Вот мой код:

[System.ComponentModel.DataObject]
    [Serializable]
    public class Example
    {
        int _example1 = new int();
        string _example2;
        string _example3; 
        decimal _example4 = new decimal();

        public int example1
        {
            get { return _example1; }
            set { _example1 = value; }
        }

        public string example2
        {
            get { return _example2; }
            set { _example2 = value; }
        }

        public string example3
        {
            get { return _example3; }
            set { _example3 = value; }
        }

        public decimal example4
        {
            get { return _example4; }
            set { _example4 = value; }
        }

        private tblTestTableAdapter _testAdapter = null;
        protected tblTestTableAdapter Adapter
        {
            get
            {
                if (_testAdapter == null)
                    _testAdapter = new tblTestTableAdapter();

                return _testAdapter;
            }
        }

Webform:

 protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
            }
            else
            {
                example = (List<Example>)ViewState["Examples"];
            }
        }

        private List<Example> example;
        public List<Example> GetExample()
        {
            return example;
        } 

        protected void btnRow_Click(object sender, EventArgs e)
        {
            example = new List<Example>(); 
            Example e = new Example();
            e.example1 = Convert.ToInt32(txtE1.Text);
            c.example2 = txtE2.Text;
            c.example3 = txtE3.Text;
            c.example4 = Convert.ToDecimal(txtE4.Text);

            example.Add(e);
            ViewState["Examples"] = example;

            btnRow.Enabled = false;

        }

В чем проблема?

1 Ответ

0 голосов
/ 08 февраля 2011

При обозначении класса как Serializable каждый класс и класс зависимых объектов внутри него, который предоставляется внешним образом, должен быть помечен как Serializable.Это потому, что любой процесс, который собирается выполнить сериализацию, будет пытаться правильно сериализовать каждый открытый элемент.

К вашему сведению, табличные адаптеры не предназначены для публичного представления, поскольку они предоставляют функциональность, а не свойства и поля.Функциональность не передается через последовательное соединение.Я бы порекомендовал вам удалить публичный характер адаптера в вашем примере.

Редактировать 2: После перечитывания кода и поиска документации по уровням защиты сериализованных свойств я наткнулся на по этой ссылке, которая описывает реальную проблему здесь.Вы не можете сериализовать свойство только для чтения (я полностью забыл об этом), и ваш табличный адаптер является свойством только для чтения.Предоставьте ему набор, и он должен начать функционировать.

Редактировать: Пример кода

[Serializable]
public class MySerializableClass
{
    public MySerializableClass()
    {

    }

    // This string serializes ok
    public string MyStringProperty { get; set; } 

    // Because this property is public in scope it must be serializable
    // because it will be translated at a public scope. This will throw
    // an exception
    public myNonSerializableClass NotSerializableObject { get; set; }   

    // Because this property is private in scope, it will not be included
    // in any serialization calls, so it will not throw an exception, but
    // it will also not be available in whatever remote class calls it.
    private myNonSerializableClass SerializableObject { get; set; } 

    // Because this property object is serializable in code it will be
    // ok to make it public because it will natively serialize itself
    public MyOtherSerializableClass OtherSerializableObject { get; set; }

}
...