自定义序列化/反序列化对象在PHP(或Ruby/Perl/Java,如果更容易)


Custom serialization/deserialization of objects in PHP (Or Ruby/Perl/Java if easier)

如果有人能提供一些关于基于非xml格式的PHP对象的反序列化和序列化的见解,我将不胜感激。我也没有设置PHP;如果有人认为Perl、Ruby或Java更容易,我很乐意使用。

我正在使用的API期望被这样调用(它不是一个库系统,但这个例子很好地说明了API):

 <request>
     <method>getBookInfo</method>
     <elements>
         <type>bookObject</type>
         <string>bookTitle</string>
         <string>2001: A Space Odyssey</string>
     </elements>
 </request>

然后提供如下响应:

 <response>
     <method>getBookInfo</method>
     <elements>
         <type>bookObject</type>
         <string>bookId</string>
         <string>12345</string>
         <string>bookTitle</string>
         <string>2001: A Space Odyssey</string>
         <string>locations</string>
         <list>
             <length>3</length>
             <string>High St Library</string>
             <string>Queen St Library</string>
             <string>Downtown Library</string>
         </list>
     </elements>
 </response>

如果使用<key>value</key>格式就很简单了,但是<string>key</string>后面跟着<string>value</string>格式让我很困惑。

任何帮助都将是非常感激的。

提前感谢!

,

编辑-样例PHP类,如果需要帮助说明解决方案

class Book {
        var $bookId;
        var $bookTitle;
        var $locations = array('location1', 'location 2');
}

可能不是一个完整的答案,但是对于注释来说太长了。

你能走哪条路取决于你到底想要达到什么目标。我的意思是你的算法需要有多通用。如果总是

<type>someType</type>

和任意数目的

<string>key1</string>
<string>val1</string>

<string>key1</string>
<list>
    <length>3</length>
    <string>High St Library</string>
    <string>Queen St Library</string>
    <string>Downtown Library</string>
</list>

<type></elements>的另一行结束,您可以编写一些基本脚本,遍历这些行,直到找到/<type>.*</,捕获.*(在Perl中它将是/<type>(.*)</),然后查找下一行中的第一个键,下一行中的第一个值(如果在下一行中有<list>,则相应地处理)等等。然而,这对我们所知甚少的格式有很大的假设。例如,类型、键或值中是否存在<> ?如果是这样,正则表达式将变得更加复杂。但也可能有其他不同类型的值或键根本没有值。因此,如果您需要更一般的信息,则需要了解更多有关格式的信息,最好是某种文档。