diff --git a/modules/core/include/opencv2/core/persistence.hpp b/modules/core/include/opencv2/core/persistence.hpp index e00c84940..93f7381bf 100644 --- a/modules/core/include/opencv2/core/persistence.hpp +++ b/modules/core/include/opencv2/core/persistence.hpp @@ -697,9 +697,8 @@ void write(FileStorage& fs, const String& name, const Range& r ) template static inline void write( FileStorage& fs, const String& name, const std::vector<_Tp>& vec ) { - fs << (DataType<_Tp>::fmt != 0 ? "[:" : "["); + internal::WriteStructContext ws(fs, name, FileNode::SEQ+(DataType<_Tp>::fmt != 0 ? FileNode::FLOW : 0)); write(fs, vec); - fs << "]"; } static inline diff --git a/modules/core/src/persistence.cpp b/modules/core/src/persistence.cpp index 3755eccf7..af6a23cd1 100644 --- a/modules/core/src/persistence.cpp +++ b/modules/core/src/persistence.cpp @@ -5486,11 +5486,28 @@ internal::WriteStructContext::WriteStructContext(FileStorage& _fs, { cvStartWriteStruct(**fs, !name.empty() ? name.c_str() : 0, flags, !typeName.empty() ? typeName.c_str() : 0); + if ((flags & FileNode::TYPE_MASK) == FileNode::SEQ) + { + fs->elname = String(); + fs->state = FileStorage::VALUE_EXPECTED; + fs->structs.push_back('['); + } + else + { + fs->elname = String(); + fs->state = FileStorage::NAME_EXPECTED + FileStorage::INSIDE_MAP; + fs->structs.push_back('{'); + } } internal::WriteStructContext::~WriteStructContext() { cvEndWriteStruct(**fs); + fs->structs.pop_back(); + fs->state = fs->structs.empty() || fs->structs.back() == '{' ? + FileStorage::NAME_EXPECTED + FileStorage::INSIDE_MAP : + FileStorage::VALUE_EXPECTED; + fs->elname = String(); }