Pointers 包含指针的派生类型的未格式化读/写

Pointers 包含指针的派生类型的未格式化读/写,pointers,serialization,fortran,Pointers,Serialization,Fortran,使用Fortran 95 我需要使用未格式化写入(随后使用未格式化读取重新加载)序列化复杂的派生类型(包含其他派生类型) 最简单的就是简单 write(lun) myComplexType 但是,这不起作用,因为类型包含指针。我不担心保留指针(我可以单独序列化它指向的内容,并在以后重新加载时重新建立指针) 因为派生类型的结构容易更改,所以我希望避免在主代码或定义的输出过程中分别编写每个元素 有没有一种简单的方法可以进行无格式写入,忽略指针,并且不需要我单独处理几十个其他嵌套数据元素,这会给我带

使用Fortran 95

我需要使用未格式化写入(随后使用未格式化读取重新加载)序列化复杂的派生类型(包含其他派生类型)

最简单的就是简单

write(lun) myComplexType
但是,这不起作用,因为类型包含指针。我不担心保留指针(我可以单独序列化它指向的内容,并在以后重新加载时重新建立指针)

因为派生类型的结构容易更改,所以我希望避免在主代码或定义的输出过程中分别编写每个元素

有没有一种简单的方法可以进行无格式写入,忽略指针,并且不需要我单独处理几十个其他嵌套数据元素,这会给我带来维护问题

如果没有一种简单的方法,我可能不得不将指针保存在一个单独的并行数据结构中,但我对此并不满意,因为我需要确保它们在作为参数传递时不会分离或不同步(所讨论的结构保持复杂模拟的状态,我真的希望将整个状态保持在一个结构中)


基本目的只是将模拟状态序列化为文件,以便以后可以从状态的序列化转储重新启动模拟。

一种方法是将非指针组件拆分为它们自己的类型,然后将其用作另一个“包装器”的组件类型类型,该类型还包含指针

TYPE :: non_pointer
  ! Lots of non-pointer components/nested types, etc.
END TYPE non_pointer

TYPE :: wrapper
  TYPE(non_pointer) :: stuff
  TYPE(xxx), POINTER :: ptr_comp
END TYPE wrapper
然后,您的输入/输出语句引用
stuff
组件

TYPE(wrapper) :: my_simulation_state

WRITE (unit) my_simulation_state%stuff
过程通常对包装器类型的对象进行操作,这仍然将“整个状态”保持在一个结构中


它是否合适取决于从现有类型中提取指针组件的容易程度。

一种方法是将非指针组件拆分为它们自己的类型,然后作为另一个“包装器”类型的组件类型使用,该类型也包含指针

TYPE :: non_pointer
  ! Lots of non-pointer components/nested types, etc.
END TYPE non_pointer

TYPE :: wrapper
  TYPE(non_pointer) :: stuff
  TYPE(xxx), POINTER :: ptr_comp
END TYPE wrapper
然后,您的输入/输出语句引用
stuff
组件

TYPE(wrapper) :: my_simulation_state

WRITE (unit) my_simulation_state%stuff
过程通常对包装器类型的对象进行操作,这仍然将“整个状态”保持在一个结构中


是否合适取决于如何从现有的类型中提取指针分量。

< P>由伊恩的回答启发,考虑继承来分离非指针和指针数据,只写基本部分可能是有趣的(但实际上,合成方法可能更灵活,更容易推荐)。(例如)

结果:

 sim2 (before) =            0   0.0000000    
 sim2 (after)  =          100   1.2300000

受伊恩的回答启发,还可以考虑继承来分离非指针和指针数据,只写基本部分。(但实际上,合成方法可能更灵活,更容易推荐)(

)。 结果:

 sim2 (before) =            0   0.0000000    
 sim2 (after)  =          100   1.2300000

人们甚至可以(在IanH的回答中)拥有用户定义的I/O,以便
write(100)sim1
完全按照预期工作(程序只需执行
write(unit,…)obj%simbase\u t
。感谢您的回复。我认为在包装器中分离指针和非指针元素可能是我必须采取的方式。甚至可以(在IanH的回答中)使用用户定义的I/O,以便
write(100)sim1
完全按照预期工作(过程只是执行
write(unit,…)obj%simbase\u t
。感谢您的回复。我认为在包装器中分离指针和非指针元素可能是我必须采取的方法。