C# “序列化异常”;未标记为可序列化";当尝试序列化字典时

C# “序列化异常”;未标记为可序列化";当尝试序列化字典时,c#,forms,serialization,C#,Forms,Serialization,我正在尝试为表单应用程序序列化词典。我正在制作mp3播放器,希望能够创建播放列表。我了解到词典标记为[Serializable](并实现ISerializable)所以序列化应该是可能的,所以我想我可以使用它。但是,当我试图序列化一个时,我得到了上面的错误。我遗漏了什么吗?字典不可能序列化而不出错吗? 我的代码: static Dictionary playlatracks=new Dictionary(); 公共播放列表() { 初始化组件(); } 私有无效按钮1\u单击(对象发送者,事件



我正在尝试为表单应用程序序列化词典。我正在制作mp3播放器,希望能够创建播放列表。我了解到词典标记为[Serializable](并实现ISerializable)所以序列化应该是可能的,所以我想我可以使用它。但是,当我试图序列化一个时,我得到了上面的错误。我遗漏了什么吗?字典不可能序列化而不出错吗? 我的代码:

static Dictionary playlatracks=new Dictionary();
公共播放列表()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
字符串[]文件名、文件路径;
openFileDialog1.Filter=“所有支持的音频|*.mp3;*.wma | MP3s |*.mp3 | WMAs |*.wma”;
if(openFileDialog1.ShowDialog()==System.Windows.Forms.DialogResult.OK)
{
filepath=openFileDialog1.filename;
filenames=openFileDialog1.SafeFileNames;
for(int i=0;i0)
{
Tracks.序列化播放列表(textBox1.Text,playlitracks);
}
}
else{MessageBox.Show(“选择播放列表名称!”);}
}
}

轨道类别:

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!"); }
        }
    }
[可序列化]
班级轨道
{
公共字符串songName{get;set;}
公共字符串路径{get;set;}
公共字符串album=“未知”;
公共时间跨度持续时间;
公共字符串artistName=“未知”;
公共字符串musicGenre=“未知”;
公共uint AR=0;
私有字符串语言=“未知”;
私人int播放频率=0;
公共字符串title=“未知”;
公共i结构[]图片;
public bool picExists=false;
公共void读取元数据(字符串路径)
{
#区域分配MetadataToTrack
var-tfile=TagLib.File.Create(songPath);
this.publishedYear=tfile.Tag.Year;
if(tfile.Tag.firstAlbumArtister!=null)
{
this.artistName=tfile.Tag.FirstAlbumArtist;
}
this.duration=tfile.Properties.duration;
if(tfile.Tag.firstgreen!=null){
this.musicGenre=tfile.Tag.firstgrove;}
如果(tfile.Tag.Album!=null)
{
this.album=tfile.Tag.album;
}
if(tfile.Tag.Title!=null)
{
this.title=tfile.Tag.title;
}
#端区
//检查uparxei艺术品
如果(tfile.Tag.Pictures.Length>0)
{
this.pictures=tfile.Tag.pictures;
picExists=true;
}
}
公共静态播放列表(字符串播放名称、字典播放列表)
{
BinaryFormatter bf=新的BinaryFormatter();
Stream st=新文件流(@“Playlists\”+playlistName+“.txt”,FileMode.OpenOrCreate);
bf.序列化(st,播放列表);
}
}


提前感谢您的回答

错误说明了一切:您使用的是未标记为可序列化的某处类型
TagLib.Id3v2.AttachmentFrame
。可能在您的
i结构中,也可能在其他地方


如果您可以控制库,请将该类型标记为可序列化。如果没有,则必须实现自己的自定义序列化。或者避免使用这种类型。或者,最后,您可以决定不序列化包含
TagLib.Id3v2.AttachmentFrame

的类型的字段。哦,您是对的。谢谢。我会将您的答案标记为正确的。
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!"); }
        }
    }
[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);
        }


    }