0

シリアライゼーションについて見つけたものはすべて調べましたが、なぜこれが機能しないのかわかりません。ビデオ クラスと曲クラスの基本クラスである myMediaInterface オブジェクトの List をシリアル化します。曲のクラスを以下に置きます。null のすべてのプロパティは xml ファイルにシリアル化されていますが、値を持つすべてのプロパティはシリアル化されていません。シリアライゼーション コードが呼び出されるまでに、リストには 882 曲があり、882 のシリアライズされた曲が xml ファイルに出力されますが、null 以外または 0 のプロパティはありません。

[XmlInclude(typeof(Song))]
[XmlInclude(typeof(Video))]

public abstract class myMediaInterface
{
    public string type { get; set; }
    public string path { get; set; }
    public String artist { get; set; }
    public String title { get; set; }
    public String album { get; set; }
    public uint trackNumber { get; set; }
    public String genre1 { get; set; }
    public TimeSpan duration { get; set; }
    public uint rating { get; set; }
    public uint bitrate { get; set; }
    public uint year { get; set; }
    public List<String> genre { get; set; }
    public int indexWithinParentCollection { get; set; }
    public string displayName { get; set; }
}

public class Song : myMediaInterface
{
    public String type
    {
        get
        {
            return "Song";
        }
        set
        {
            value = "Song";
        }
    }
    public String path { get; set; }
    public String artist { get; set; }
    public String title { get; set; }
    public String album { get; set; }
    public uint trackNumber { get; set; }
    public String genre1 { get; set; }
    public TimeSpan duration { get; set; }
    public uint rating { get; set; }
    public uint bitrate { get; set; }
    public uint year { get; set; }
    public List<String> genre { get; set; }
    public int indexWithinParentCollection { get; set; }
    public String displayName { get; set; }
}

シリアル化コード:

    static async private Task saveState()
    {

        try
        {
            XmlSerializer xmlSer = new XmlSerializer(typeof(List<myMediaInterface>), new Type[]{typeof(Song)});
            StorageFile musicFile = await KnownFolders.MusicLibrary.CreateFileAsync("PlaylistXFastMusicLoading", CreationCollisionOption.ReplaceExisting);
            IRandomAccessStream musicFileRandomAccess = await musicFile.OpenAsync(FileAccessMode.ReadWrite);
            IOutputStream outputStream = musicFileRandomAccess.GetOutputStreamAt(0);
            xmlSer.Serialize(outputStream.AsStreamForWrite(), _musicList);
            outputStream.Dispose();
        }
        catch (Exception exception)
        {
            System.Diagnostics.Debug.WriteLine(exception);
        }
    }

async private void loadState()
    {
        try
        {
            XmlSerializer xmlSer = new XmlSerializer(typeof(List<myMediaInterface>), new Type[] { typeof(Song) });
            StorageFile sampleFile = await KnownFolders.MusicLibrary.CreateFileAsync("PlaylistXFastMusicLoading", CreationCollisionOption.OpenIfExists);
            IInputStream fileStream = await sampleFile.OpenReadAsync();
            _musicList = (List<myMediaInterface>)xmlSer.Deserialize(fileStream.AsStreamForRead());
            fileStream.Dispose();
        }
        catch (Exception exception)
        {
            System.Diagnostics.Debug.WriteLine(exception);
        }
   }

およびリストクラスの初期化

    public static List<myMediaInterface> musicList = new List<myMediaInterface>();
    public static List<myMediaInterface> _musicList
    {
        get { return musicList; }
        set { value = musicList; }
    }
4

1 に答える 1

0

myMediaInterface から継承されたすべてのメンバーを再実装して非表示にしています。これは、基本クラスと継承クラスで同じフィールドが複製されていることを意味します。私はあなたがこれを望んでいると思います:

[XmlInclude(typeof(Song))]
public abstract class myMediaInterface
{
    public abstract string type { get; set; }
    public string path { get; set; }
    public String artist { get; set; }
    public String title { get; set; }
    public String album { get; set; }
    public uint trackNumber { get; set; }
    public String genre1 { get; set; }
    public TimeSpan duration { get; set; }
    public uint rating { get; set; }
    public uint bitrate { get; set; }
    public uint year { get; set; }
    public List<String> genre { get; set; }
    public int indexWithinParentCollection { get; set; }
    public string displayName { get; set; }
}

public class Song : myMediaInterface
{
    public override String type
    {
        get
        {
            return "Song";
        }
        set
        {
            value = "Song";
        }
    }
}

つまり、オブジェクトのタイプを識別するためにプロパティ「タイプ」が必要だとは思わない.object.GetType()でオブジェクトのタイプを取得できます。

于 2013-08-06T03:16:37.880 に答える