Исключение SerializationException «не помечено как сериализуемый» при попытке сериализации словаря - PullRequest
0 голосов
/ 24 января 2019
Full error : System.Runtime.Serialization.SerializationException: 'Type 'TagLib.Id3v2.AttachmentFrame' in Assembly 'taglib-sharp, Version=2.1.0.0, Culture=neutral, PublicKeyToken=db62eba44689b5b0' is not marked as serializable.'



Я пытаюсь сериализовать словарь для приложения формы. Я создаю mp3-плеер и хочу создавать списки воспроизведения. Я прочитал, что Словарь помечен как [Сериализуемый] (и реализует ISerializable), поэтому сериализация должна быть возможной, поэтому я подумал, что я мог бы использовать ее. Однако, когда я пытаюсь сериализовать одну, я получаю ошибку выше. Я что-то упускаю? Разве возможно, чтобы словарь был сериализован без получения ошибки? Мой код:

static Dictionary<String, Tracks> playlistTracks = new Dictionary<string, Tracks>();
        public Playlist()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            string[] filenames, filepaths;
            openFileDialog1.Filter = "All Supported Audio | *.mp3; *.wma | MP3s | *.mp3 | WMAs | *.wma";
            if(openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                filepaths = openFileDialog1.FileNames;
                filenames = openFileDialog1.SafeFileNames;
                for(int i = 0; i< filenames.Length; i++)
                {
                    if (!playlistTracks.ContainsKey(filenames[i]))
                    {
                        listBox1.Items.Add(filenames[i]);
                        Tracks track = new Tracks();
                        track.songName = filenames[i];
                        track.path = filepaths[i];
                        track.readMetaData(filepaths[i]);
                        playlistTracks.Add(filenames[i], track);
                    }
                }

            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != "")
            {
                if (listBox1.Items.Count > 0)
                {
                    Tracks.serializePlaylist(textBox1.Text, playlistTracks);
                }
            }
            else { MessageBox.Show("Choose a playlist name!"); }
        }
    }


Класс Tracks:

[Serializable]
    class Tracks
    {

        public string  songName { get; set; }
        public string path { get; set; }
        public string album = "Unknown";
        public TimeSpan duration;
        public string artistName = "Unknown";
        public string musicGenre = "Unknown";
        public uint publishedYear = 0;
        private string language = "Unknown";
        private int playingFrequency = 0;
        public string title = "Unknown";
        public IPicture[] pictures;
        public bool picExists = false;
        public void readMetaData(string songPath)
        {

            #region AssignMetaDataToTrack

            var tfile = TagLib.File.Create(songPath);

            this.publishedYear = tfile.Tag.Year;
            if (tfile.Tag.FirstAlbumArtist !=null)
            {
                this.artistName = tfile.Tag.FirstAlbumArtist;
            }
            this.duration = tfile.Properties.Duration;
            if (tfile.Tag.FirstGenre !=null) {
                this.musicGenre = tfile.Tag.FirstGenre; }
            if (tfile.Tag.Album != null)
            {
                this.album = tfile.Tag.Album;
            }
            if (tfile.Tag.Title != null)
            {
                this.title = tfile.Tag.Title;
            }
            #endregion
            //check an uparxei artwork
            if (tfile.Tag.Pictures.Length > 0)
            {
                this.pictures = tfile.Tag.Pictures;
                picExists = true;
            }
        }



        public static void serializePlaylist(string playlistName , Dictionary<string,Tracks> playlist)
        {
            BinaryFormatter bf = new BinaryFormatter();
            Stream st = new FileStream(@"Playlists\" + playlistName + ".txt", FileMode.OpenOrCreate);
            bf.Serialize(st, playlist);
        }


    }


Заранее спасибо за любой ответ!

1 Ответ

0 голосов
/ 24 января 2019

Ошибка говорит сама за себя: вы используете где-то тип TagLib.Id3v2.AttachmentFrame, который не помечен как сериализуемый.Возможно, в вашем типе IPicture, возможно в другом месте.

Если вы контролируете библиотеку, пометьте тип как сериализуемый.Если нет, вы должны реализовать свою собственную сериализацию.Или избегайте использования этого типа.Или, наконец, вы можете решить не сериализовать поле типа, содержащего TagLib.Id3v2.AttachmentFrame.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...