"easiest" is not easily defined.
1. You could just dump the memory to the files and read it back as raw memory. But that means you can never ever ever change the definition of your UDT, otherwise those files are not just invalid, they could be corrupted (e.g. moving bit patterns to a float that is NaN, etc.). This is "easiest" but those files are not human readable.
2. An alternative is to take advantage of JSON grammar. JSONPRINT and JSONPARSE could be used. The benefits here are it is very human readable, and can be easily understood/displayed/modified by other programs. This will definitely complicate the logic, but stick it in its own code-block, and it will be buried. It's also a memory hog, but we could work around that by not using arrays, but writing each record to a text file with CR/LF as the delimiter for each JSON record instead of JSON array grammar. Also, if you add a field or remove a field, the code can be easily tweaked and logic could be added to handle missing new fields in older files, etc.
If you know this UDT is written in stone, option 1 is definitely "easier" than option 2. Option 2 is not that bad since the code will be mostly understandable. Stage program would make this work nicely.
WriteDataFile
S0
RST C99
FILEOPEN OnSuccess JMP S1 OnError JMP S99
set record index V42 to 0
SG S1
JSONPRINT JSONBUILD MyUDT[v42] to SL0 // this is more complicated parameters, but the JSONPRINT editor has a short cut to generate all 15 fields with a single button)
STRPRINT SL0 Append CR/LF "$0D$0A"
JMP S2
SG S2
FILEWRITE SL0 OnSuccess JMP S3 OnError JMP S99
SG S3
INC V42
V42 >= 52 JMP S4
ELSE JMP S1
SG S4
FILECLOSE
EXIT
SG S99
SET C99 // turn on alarm C99 that file creation failed, e.g. missing SD card, etc.
EXIT
The File Read mechanism is a little more complicated, but kick the tires with this, get it working, look at the file on your PC, see if this is worth doing (a raw binary file will be very hard to understand).