在 MFC 中序列化 CTypedPtrList 不会将数据保存在列表中

Posted

技术标签:

【中文标题】在 MFC 中序列化 CTypedPtrList 不会将数据保存在列表中【英文标题】:Serializing a CTypedPtrList in MFC Does Not Save the Data in the List 【发布时间】:2016-02-14 21:46:39 【问题描述】:

当我尝试序列化 CTypedPtrList 然后从文件中检索该列表时,会保存列表中的对象数,但不会保存对象中的实际数据。

例如,如果我要保存到文件然后从文件加载,我可以循环浏览所有四个条目,但没有一个变量会包含它们的数据。

这是适用的代码。

LEDFrame.h:

#pragma once
#include "afx.h"

#define NUMLAYERS 12
#define NUMROWS 8
#define NUMCOLUMNS 12

class LEDFrame :
    public CObject

    DECLARE_SERIAL(LEDFrame)  // DECLARE_SERIAL macro call to enable serialization of CObjects
public:
    bool data[NUMLAYERS][NUMROWS][NUMCOLUMNS]; // this holds one frame of the animation
    int m_FrameOnTime; // this holds how long the frame is on for, a value of 1 is 10 ms
    LEDFrame();
    ~LEDFrame();
;

typedef CTypedPtrList<CObList, LEDFrame*> CLEDFrameList; // this is the list of frames, CTypedPtrlList can be shared between document and view

LEDFrame.cpp

#include "stdafx.h"
#include "LEDFrame.h"

IMPLEMENT_SERIAL(LEDFrame, CObject, 0) // implement_serial macro call for serialization

LEDFrame::LEDFrame()



LEDFrame::~LEDFrame()


LEDCubeDoc.h

public:
    virtual void Serialize(CArchive& ar);
private:
    CLEDFrameList myLEDFrameList;

LEDCubeDoc.cpp

void CLEDCubeDoc::Serialize(CArchive& ar)

    TRACE("Entering CLEDCubeDoc::Serialize");
    if (ar.IsStoring())
    
        // TODO: add storing code here
    
    else
    
        // TODO: add loading code here
    
    myLEDFrameList.Serialize(ar);

LEDCubeView.h

public:
    CLEDFrameList* myViewLEDFrameList;  // a pointer to the documents myLEDFrameList, this edits myLEDFrameList in the doc

我认为它可能无法将列表正确保存到磁盘。这是因为当我查看保存的文件时,它只有 22 个字节。

我在 stdafx.h 中包含“afxtempl”。

我的程序基于 www.tenouk.com 上的 MFC 教程的模块 10 和 11。网址是http://www.tenouk.com/cplusplusnmfc.html

您能帮我纠正这个问题,以便我可以序列化我的 CTypedPtrList 吗?

谢谢,

安德鲁

【问题讨论】:

【参考方案1】:

我看不到任何LEDFrame::Serialize 的声明,所以我猜你还没有实现它。这意味着,CObject 的序列化方法将被调用,并且该函数应该如何知道,你的类里面有什么?!

顺便说一句:在ar.IsStoring 的两种情况下,您都必须调用myLEDFrameList.Serialize(ar); - 一种用于存储,其他部分用于加载。如果您需要特殊的加载顺序或必须调用某些函数来帮助加载,您可以在此处进行。

【讨论】:

我想添加 LEDFrame::Serialize,但它会序列化什么? myLEDFrameList 是 LEDCubeDoc 的一部分,而不是 LEDFrame。我认为 LEDFrame::Serialize() 会因为以下语句而被调用: typedef CTypedPtrList 看这个问题:***.com/questions/12629476/mfc-serialization?rq=1

以上是关于在 MFC 中序列化 CTypedPtrList 不会将数据保存在列表中的主要内容,如果未能解决你的问题,请参考以下文章

MFC中序列化

《深入浅出MFC》第八章 Document-View深入探讨

C# 中的 MFC 对象序列化

MFC学习一 MFC基础类及其层次结构

MFC C++ 应用程序的最佳 XML 序列化库

Qt持久性对象进行序列化(同时比较了MFC与Java的方法)