将类对象存储到EEPROM或其他内存

时间:2016-01-15 10:17:46

标签: c++ pointers arduino

在动态内存中,我能够在对象上完美地创建和操作。 我通过解析一个完美的SD卡来创建这些对象。 由于微控制器上的动态存储器的限制,我想 将这些对象存储在EEPROM或FRAM上。

以下函数(来自FRAM库)可用于将动态内存中的字节存储到FRAM:

  void     write8 (uint16_t addr, uint8_t value);
  void     write (uint16_t addr, const uint8_t *values, size_t count);
  uint8_t  read8  (uint16_t addr);

对象具有以下类:

class Person
{
  public:
    char* m_pStrName;
    int m_nAge;
    bool m_fIsMale;

    //Constructor
    Person(char* strName, int nAge, bool fIsMale);
    Person();

    //Copy constructor
    Person( const Person &obj );

    //Destructor
    ~Person();
};

我尝试了以下方法来创建一个Person对象并存储它:

Person* pTestPerson = new Person();
fram.write(0x0000, pTestPerson, sizeof(Person));

//由于少量动态内存(我创建此对象的位置) //我应该释放并删除指向该人的指针吗?

delete pTestPerson;
pTestPerson = nullptr;

//现在有趣的部分,如何读取sizeof(Person)字节数并创建一个新的有效Person对象?我尝试了以下内容,但可能是胡说八道:

Person* pReadPerson = new Person();

for (int x = 0; x < sizeof(Person); x++)
{
    *(pReadPerson + x) = fram.read(0x0000 + x);
}

2 个答案:

答案 0 :(得分:2)

您需要为对象编写自定义序列化/反序列化代码。这在计算机编程中是一个非常普遍的问题,因此很多语言都内置了序列化(Python是一个突出的例子)。

在你的情况下,你可以这样做:

  1. 写m_pStrName lentgh
  2. 写m_nAge
  3. 写m_fIsMale
  4. 写入m_pStrName的内容
  5. 反序列化看起来很相似:  1.读取m_pStrName并将其存储在一旁  2.读取m_nAge并将其存储在对象中  3.读取m_fIsMale并将其存储在对象中  4.分配“m_pStrName的长度”字节并将其附加到m_pStrName指针  5.读取名称并将其存储在m_pStrName内存块中(注意字符串长度)

    数据序列化和反序列化很棘手,因为很容易犯一个小错误,完全破坏你的对象。

    另一个严重的问题是数据版本控制。如果您更新Person布局,则需要更改序列化代码并(可能)使其向后兼容。

答案 1 :(得分:0)

类的类型的对象不会在分配给对象的内存中存储一​​些属性,如方法,vptr。因此,你不能在这个单词的直接含义中存储类。但是,您可以将数据有效负载仅放入ROM中,并且类可以通过引用来操作。因此,换句话说,该类将仅根据您的需要实现使用ROM内容的功能。然后RAM内存占用将被最小化。