Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 17.09.2015
Сообщений: 20
.NET 4.x

WCF и сериализация, не могу добавить более одного объекта

17.03.2018, 20:46. Показов 1334. Ответов 3
Метки wcf (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется служба и клиент, пытался реализовать сериализацию, но почему то добавляет только один объект, при попытке добавить новый объект(автомобиль), старый перезаписывается. Мне необходимо чтобы добавленные машины сохранялись в файл, и читались из него. Пока что накатал такой "ужас". Подскажите пожалуйста что необходимо исправить.
Код сервера
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using System.Runtime.Serialization;
using System.IO;
using System.Runtime.Serialization.Json;
 
namespace b_firstService
{
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
 
     public class WorkCar:IWorkCar
    {
        public int global_id = 0;
        public List<Car> Cars = new List<Car>();
        public List<Car> GetCars()
        {
            var ds = new DataContractSerializer(typeof(Car));
            Car c2;
            using (Stream s = File.OpenRead("person.xml"))
                   
                c2 = (Car)ds.ReadObject(s); // Десериализация
            Cars.Add(c2);
            return Cars;
        }
 
 
        public void AddCars(Car car)
        {
            global_id++;
            car.id = global_id;
            Car z = new Car { modelName = car.modelName, regnum = car.regnum, mark = car.mark, category = car.category };
            var ds = new DataContractSerializer(typeof(Car));
            using (Stream s = File.Create("person.xml"))
                ds.WriteObject(s, z); // Сериализация
            Cars.Add(car);
          
        }
 
 
        public void DelCar(int id)
        {
            Cars.Remove(Cars.Find(e => e.id.Equals(id)));
        }
 
 
 
   
 
    
    }
}

Код клиента
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using c_client.WorkCarRef;
 
namespace c_client
{
    class Program
    {
        static void Main(string[] args)
        {
 
            WorkCarClient workcar = new WorkCarClient("BasicHttpBinding_IWorkCar");
            int global_id = 0;
            string action = "0";
            Console.WriteLine("Добрый день");
            while (action != "4")
            {
                Console.WriteLine(
                    "Что вы хотите сделать:\n" +
                      "1 - Добавить запись об автомобиле\n" +
                        "2 - Просмотреть все записи\n" +
                         "3 - Удалить запись\n" +
                          "4 - Выход\n"
                    );
                action = Console.ReadLine();
                if (action == "1")
                {
                    Car car = new Car();
                    Console.WriteLine("Введите название модели автомобиля");
                    car.modelName = Console.ReadLine();
                    Console.WriteLine("Введите название марки");
                    car.mark = Console.ReadLine();
                    Console.WriteLine("Регистрационный номер");
                    car.regnum = Console.ReadLine();
                    Console.WriteLine("Категория автомобилей");
                    car.category = Console.ReadLine();
                  //  car.create = DateTime.Now;
                    workcar.AddCars(car);
                    
                   
                    Console.WriteLine("Машина добавлена");
                }
 
                else if (action == "2")
                {
                    Console.Clear();
                    Car[] spisok = workcar.GetCars();
                    if (spisok.Length > 0)
                    {
                        foreach (Car car in spisok)
                        {
                            Console.WriteLine("№" + car.id + ":" + car.modelName );
                        }
                    }
                    else
                    {
                        Console.WriteLine("Машин в базе данных нет!\n");
                    }
                }
                else if (action == "3")
                {
                    Console.WriteLine("Машину с каким номером удалить?");
                    string id = Console.ReadLine();
                    workcar.DelCar(Convert.ToInt32(id));
                }
            }
            Console.WriteLine("ДО свидания!");
            Console.ReadLine();
 
        }
 
 
    }
    }


Код класса Сar
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
 
namespace b_firstService
{
    [DataContract]
   public class Car
    {
        [DataMember]
        public int id { get; set; }
        [DataMember]
        public string modelName { get; set; }
        [DataMember]
        public string mark { get; set; }
        [DataMember]
        public string category { get; set; }
        [DataMember]
        public string regnum { get; set; }
        [DataMember]
        public DateTime create { get; set; }
 
 
 
    }
 
 
 
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.03.2018, 20:46
Ответы с готовыми решениями:

Найти вероятность того, что будет обнаружено не более одного объекта
Здравствуйте! Помогите пожалуйста разобраться с задачей. У меня есть некоторые мысли по решению, но не уверен, что правильные. Задача:...

Как добавить перекрытие одного объекта другим при вращении?
Доброго времени суток, столкнулся с такой проблемой, есть 1 объект (квадрат), к нему программно, я добавляю загруженный Bitmap. Все бы...

Как добавить два пути перемещения для одного объекта?
Доброго дня! Хочу сделать интерактивную турнирную сетку (файл прикладываю). Понятно, как сделать первый путь перемещения - победителя...

3
134 / 130 / 107
Регистрация: 17.03.2009
Сообщений: 364
19.03.2018, 12:13
Лучший ответ Сообщение было отмечено Wreos как решение

Решение

Вы создаете новый файл и помещаете туда один вновь добавленный объект.
Для сохранения всех элементов списка вам надо сериализовать сам список Cars,
после добавления туда нового элемента
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        public void AddCars(Car car)
        {
            global_id++;
            car.id = global_id;
            Car z = new Car { modelName = car.modelName, regnum = car.regnum, mark = car.mark, category = car.category };
            Cars.Add(car); //добавили новый
 
           //Сохранили всё
            var ds = new DataContractSerializer(Cars));
            using (Stream s = File.Create("person.xml"))
                ds.WriteObject(s, Cars); // Сериализация
 
          
        }
 
        private void SaveChanges(string fileName)
        {
            var ser = new XmlSerializer(Cars.GetType());
            using (TextWriter writer = new StreamWriter(fileName))
            {
                ser.Serialize(writer, Cars);
            }
        }
1
0 / 0 / 0
Регистрация: 17.09.2015
Сообщений: 20
19.03.2018, 15:17  [ТС]
Cпасибо, только я не понял, подскажите пожалуйста а метод SaveChanges откуда вызывать и каким образом?
И почему то в переменной ds выдает ошибку невозможности преобразования

Добавлено через 6 минут
А как десериализовать это все дело?
0
134 / 130 / 107
Регистрация: 17.03.2009
Сообщений: 364
19.03.2018, 16:51
Лучший ответ Сообщение было отмечено Wreos как решение

Решение

По поводу

Это обобщенные методы XML сериализации:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
       public void AddCars(Car car)
        {
            global_id++;
            car.id = global_id;
            Car z = new Car { modelName = car.modelName, regnum = car.regnum, mark = car.mark, category = car.category };
            Cars.Add(car); //добавили новый
            SaveChanges("cars.txt");
 
            //Десериализация, если понадобится
           Cars = ReadCars("cars.txt");
 
 
        public void SaveChanges(string fileName)
        {
            FileStream writer = new FileStream(fileName, FileMode.Create);
            DataContractSerializer ser =
                new DataContractSerializer(typeof(Cars));
            ser.WriteObject(writer, Cars);
            writer.Close();
        }
 
       //Десериализатор 
        public Cars ReadCars(string fileName)
        {
            FileStream fs = new FileStream(fileName,
            FileMode.Open);
            XmlDictionaryReader reader =
                XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
            DataContractSerializer ser = new DataContractSerializer(typeof(Cars));
 
            // Deserialize the data and read it from the instance.
            List<Car>cars =
                (List<Car>)ser.ReadObject(reader, true);
            reader.Close();
            fs.Close();
            return cars;
        }
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.03.2018, 16:51
Помогаю со студенческими работами здесь

Не могу добавить в dataGridView более 655 столбцов
Вылетает ошибка &quot;Сумма значений FillWeight столбцов не должна превышать 65535.&quot;. Подскажите пожалуйста как увеличить количество...

Найти слова, повторяющиеся более одного раза, не могу найти ошибку
#include &lt;iostream&gt; using namespace std; void obr1(char **s, char **mas, int n, int m) { int i; int k; char *tm; for(i...

Сериализация объекта
У меня есть абстрактный метод: public abstract void save(); Вот его одна из вариаций переопределения public override void save()...

Сериализация объекта
Доброго времени суток. Есть объект, нужно сериализовать его и записать в файл: сериализовали - записали, сериализовали - записали. Можно...

Сериализация объекта
public class UserObject { public string variable1{ get; set; } public LibraryType variable2{ get; set;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru