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);
}
}
Заранее спасибо за любой ответ!