Re: Can't read CString after serialization
Thought I'd add the actual store and load code-
CFile AspectDatFile;
AspectDatFile.Open(acPath, CFile::modeCreate | CFile::modeWrite);
CArchive archive1(&AspectDatFile, CArchive::store, 40960);
//AspectArrayHelioData generated here
AspectArrayHelioData.Serialize(archive1);
archive1.Close();
AspectDatFile.Close();
CFile AspectDatFile;
if (AspectDatFile.Open(acPath, CFile::modeRead) != 0){
CArchive archive2(&AspectDatFile, CArchive::load, 4960);
TempAspectArrayHelio.Serialize(archive2);
archive2.Close();
AspectDatFile.Close();
}
On Mar 10, 11:23 pm, Alexh <ale...@sbcglobal.net> wrote:
Thanks for the info - in my app the store to file would typically only
be done once after install but the read would be done often. I'm using
Visual Studio C++ 2005, no unicode. Here is my serialization code.
Pretty basic compared to the examples in the reference you provided.
The last item m_AspectStr is the only CString item. In my code I also
archive a different CArray to file and it never fails but it has no
CString items.
The other odd thing is that when I generate the archive, often the
read will work for a while but eventually it fails as I described.
IMPLEMENT_SERIAL(CPlanetAspect, CObject,1)
CPlanetAspect::CPlanetAspect()
{
}
CPlanetAspect::~CPlanetAspect()
{
}
void CPlanetAspect::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if (ar.IsStoring()){
ar << m_BarNum
<< m_Date
<< m_NatalT=
ransit1
<< m_Planet=
1
<< m_Planet=
1Deg
<< m_Aspect=
<< m_NatalT=
ransit2
<< m_Planet=
2
<< m_Planet=
2Deg
<< m_Aspect=
Str;
}
else{
ar >> m_BarNum
>> m_Date
>> m_NatalT=
ransit1
>> m_Planet=
1
>> m_Planet=
1Deg
>> m_Aspect=
>> m_NatalT=
ransit2
>> m_Planet=
2
>> m_Planet=
2Deg
>> m_Aspect=
Str;
}
}
On Mar 10, 10:32 pm, "Tom Serface" <tom.nos...@camaswood.com> wrote:
You didn't say which version of C++ you are using (although you did ment=
ion
one of the ATL functions), but this might be your problem:
http://support.microsoft.com/kb/193100
Are you building in Unicode? Perhaps you could also list your seriali=
zing
code and that might reveal something. These kinds of problems are why=
I
typically don't use serializing any more. I like to use XML, but any =
kind
of ASCII based file format would work in my opinion. They are easier =
to
read when you want to change the versions and/or access it from another
program. You may also find this article interesting:
http://www.codeproject.com/KB/cpp/serialization_primer1.aspx
Note, this is part 1 of 3 parts.
Tom
"Alexh" <ale...@sbcglobal.net> wrote in message
news:9d0514d8-6156-4bd2-9e94-8b8da3292b60@d4g2000prg.googlegroups.com...
Hi,
I have a CArray <MyClass, MyClass&> MyClassArray. MyClass contains
various elements, int, double and a CString (ex. MyString).
MyClass.cpp has the necessary Serialize statement.
In my code, MyClassArray is generated as necessary and serialized to a=
file. Later it is read from the file and restored into MyClassArray.
At this point I get an error whenever I access the CString element in
MyClass.
I can access all other int or double elements in MyClass just fine.
However, any access of the form -
MyCArray.GetAt(i).MyString or -
MyClass = MyCArray.GetAt(i);
MyString1 = MyClass.MyString;
gives a run time error in the MS file atlsimpstr.h. Here is the line
from the file-
// This is a part of the Active Template Library.
// Copyright (C) Microsoft Corporation
// All rights reserved.
static CStringData* __cdecl CloneData( __in CStringData* pData )
{
CStringData* pNewData = NULL;
IAtlStringMgr* pNewStringMgr = pData->pStringMgr->Clone(); /////this=
line fails
All of the vars on that line are reporting as "expression cannot be
evaluated". Any idea what's going on here? I don't think it's
something obvious because as I said, all of the numeric elements are
accessible.
Thanks- Hide quoted text -
- Show quoted text -- Hide quoted text -
- Show quoted text -