代码之家  ›  专栏  ›  技术社区  ›  caw

在文本文件中保存对象列表

  •  4
  • caw  · 技术社区  · 16 年前

    我有以下课程:

    type
      TSong = class(TObject)
      private
        FArtist: String;
        FTitle: String;
        procedure SetArtist(Artist: String);
        procedure SetTitle(Title: String);
      public
        property Artist: String read FArtist Write SetArtist;
        property Title: String read FTitle Write SetTitle;
        constructor Create(Artist, Title: String);
      end;
    type
      TPlaylist = class(TList)
        private
          procedure ShowInListBox(Box: Pointer);
        public
          { Public-Deklarationen }
        end;
    

    在运行时,我创建这些类的实例:

    Playlist := TPlaylist.Create;
    Playlist.Add(TSong.Create('Artist 1', 'Title 1'));
    Playlist.Add(TSong.Create('Artist 2', 'Title 2'));
    Playlist.Add(TSong.Create('Artist 3', 'Title 3'));
    Playlist.Add(TSong.Create('Artist 4', 'Title 4'));
    

    当程序关闭时,我想把这些数据保存到一个文本文件中。我该怎么做?

    procedure SaveToTxtFile(fName: String);
    

    这样的函数到底应该做什么?当程序再次启动时,我希望能够再次建立播放列表。

    如果将数据保存在这样的文本文件中就更好了:

    Artist 1///Title 1
    Artist 2///Title 2
    
    1 回复  |  直到 9 年前
        1
  •  7
  •   Mason Wheeler    16 年前

    序列化 ,将对象转换为文件等可流化形式。

    你需要制定一个格式。格式到底是什么并不重要,只要它是一致的并保留重建对象所需的所有数据。你说你想要一个文本文件,所以在这种情况下,你可以通过使用TStringList(它内置了文件IO)来获取一些快捷方式。

    尝试以下操作:

    procedure TSong.Serialize(serializer: TStringList);
    begin
      serializer.Add(format('%s///%s: %s', [Artist, Title, Filename])); //add a filename member! You need one!
    end;
    
    procedure TPlaylist.Serialize(const filename: string);
    var
      serializer: TStringList;
      i: integer;
    begin
      serializer := TStringList.Create;
      try
        for i := 0 to Count - 1 do
          TSong(self[i]).Serialize(serializer);
        serializer.SaveToFile(filename);
      finally
        serializer.Free;
      end;
    end;
    

    您还需要实现反向反序列化。应该不会太难。