Member 12581582 Ответов: 1

Десериализация, значение typeof


- Привет!
Я сделал этот код: (visual studio, новый проект, visual c#, приложение wpf)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.IO;
using System.Xml.Serialization;

namespace lion4
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Book.MyMain();
        }
    }

    public class Book
    {
        public string Name { get; set; }
        public int ISBN { get; set; }

        public static void MyMain()
        {

            Book book1 = new Book { Name = "Lion4", ISBN = 666 };

            //string bookFileName = "lion4.xaml";

            XmlSerializer serializer = new XmlSerializer(typeof(Book));

            using (TextWriter writer = new StreamWriter(@"Lion4.xml"))
            {

                serializer.Serialize(writer, book1);

            }
        }

    }
}


который создает xml-файл lion4.xml (сериализовано).

Затем я попытался использовать этот файл, чтобы попробовать десериализацию, как в этом примере (просто откройте файл, без сохранения), sth, как в этом примере:


Как использовать XML-сериализатор и десериализатор в .NET (C#) - YouTube[

Вот мой код:
.цезий :

using System;
using System.IO;
using System.Windows;
using Microsoft.Win32;
using System.Xml.Serialization;

namespace WpfTutorialSamples.Dialogs
{
    public partial class OpenFileDialogSample : Window
    {
        public OpenFileDialogSample()
        {
            InitializeComponent();
        }

        private void btnOpenFile_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            if (openFileDialog.ShowDialog() == true)
                txtEditor.Text = File.ReadAllText(openFileDialog.FileName);
            MessageBox.Show("Hello, world!", "My App", MessageBoxButton.YesNo, MessageBoxImage.Information);
            
            if (MessageBox.Show("Yes", "No", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
            {
                var path = openFileDialog.FileName;
               XmlSerializer serializer = new XmlSerializer(typeof(Book));
                StreamReader reader = new StreamReader(path);

                var input = serializer.Deserialize(reader);
                button1.Content = input;
            }
        }
    }
}


код в формате. xaml:

<pre lang="HTML"><Window x:Class="WpfTutorialSamples.Dialogs.OpenFileDialogSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="OpenFileDialogSample" Height="300" Width="708">
    <DockPanel Margin="10" Width="651">
        <WrapPanel HorizontalAlignment="Center" DockPanel.Dock="Top" Margin="0,0,0,10">
            <Button Name="btnOpenFile" Click="btnOpenFile_Click">Open file</Button>
        </WrapPanel>
        <TextBox Name="txtEditor" />
        <Button Content="Button" Height="83" Name="button1" Width="592" />
    </DockPanel>
</Window>


Единственная ошибка-typeot (Book), которая в примере видео-typeof(List<person>). Поскольку файл все еще сериализован и существует, пожалуйста, какое значение ttypeof я должен использовать? БОЛЬШОЕ СПАСИБО!!!

Что я уже пробовал:

XmlSerializer serializer = новый XmlSerializer(typeof(Book));

Sergey Alexandrovich Kryukov

Лучше не используйте устаревший XmlSerializer, который никогда не был достаточно хорош, используйте Data Contract.
—СА

Member 12581582

Здравствуйте, смысл tassk заключается в том, чтобы сделать это с помощью XmlSerializer... :)

1 Ответов

Рейтинг:
1

Member 12581582

Здравствуйте, я постарался упростить, если это возможно:

.цезий

<pre lang="c#">using System;
using System.IO;
using System.Windows;
using Microsoft.Win32;

using System.Xml.Serialization;

namespace ofd1
{
    public partial class OpenFileDialogSample : Window
    {
        public OpenFileDialogSample()
        {
            InitializeComponent();
        }


        
        private void btnOpenFile_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            if (openFileDialog.ShowDialog() == true)
                txtEditor.Text = File.ReadAllText(openFileDialog.FileName);

            var path = openFileDialog.FileName;
            XmlSerializer serializer= new XmlSerializer (typeof(Book));
            StreamReader reader = new StreamReader(path);
            var input = Convert.ToString(serializer.Deserialize(reader));

            txtEditor2.Text = input;
        }
    }
}


.код XAML

<window x:class="ofd1.OpenFileDialogSample" xmlns:x="#unknown">
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="OpenFileDialogSample" Height="300" Width="300">
    <dockpanel margin="10">
        <wrappanel horizontalalignment="Center" dockpanel.dock="Top" margin="0,0,0,10">
            <button name="btnOpenFile" click="btnOpenFile_Click">Open file</button>
        </wrappanel>
        <textbox name="txtEditor" width="129" />
        <textbox name="txtEditor2" />
    </dockpanel>
</window>


Теперь, чтобы получить десериализацию во втором текстовом поле, мне просто нужно найти объектную книгу из другого проекта. Я сделал: Solution Explorer-add reference, я нашел карту проекта и какой из них я должен выбрать, в этот момент каждый из них я выбрал неправильно и снова дает ошибку!!!

Большое спасибо, пожалуйста, я просто новичок!!! Попробуйте погуглить, но получите все, что я знаю или не помогает с этой конкретной проблемой!!!


Richard MacCutchan

Вы не можете предполагать, что ваше приложение может найти какой-то случайный класс, о котором оно ничего не знает. Вы должны включить класс Book в свой проект десериализации.

Member 12581582

Привет, я сделал это:

XmlSerializer serializer= новый XmlSerializer (typeof(Book));
StreamReader reader = новый StreamReader (путь);
var input = Convert.ToString(сериализатор.Десериализация (читатель));

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

Pleae, если есть какие-то ссылки с подобным контентом, может кто-нибудь прислать? большое спасибо