2

看来我整晚都在为此绞尽脑汁。每次我尝试序列化文档查询的结果时,都会收到bool(false)的结果。大概这意味着序列化失败(太好了!也许你愿意告诉我你为什么失败?不?不这么认为。

我已经告诉了JMSSerializerBundle我的FOSUserBundle映射保存在哪里,例如:

jms_serializer:
    metadata:
        file_cache:
            dir: "%kernel.cache_dir%/serializer"
        auto_detection: true
        directories:
            FOSUserBundle:
                namespace_prefix: "FOS\\UserBundle"
                path: "%kernel.root_dir%/config/serializer/fosuser"

我定义了一个非常简单的 XML 序列化元数据文件,例如Model.User.xml

<?xml version="1.0" encoding="UTF-8" ?>
<serializer>
    <class name="FOS\UserBundle\Model\User" xml-root-name="user" exclusion-policy="all">
        <property name="username" type="string" expose="true" />
    </class>
</serializer>

而且,在测试控制器中,我在尝试做任何更复杂的事情之前手动调用序列化程序,例如:

class DefaultController extends Controller
{
    public function serializeAction()
    {
        $userManager = // get the user manager
        $users = $userManager->findUsers();         
        $serializer = $this->get('jms_serializer');
        foreach ($users as $id => $user) {
            Debug::dump('Processing user: '.$user->getUsername());
            $result = $serializer->serialize($user, 'json');
            Debug::dump($result);
        }
        /*return a response */
    }
}

结果?总是bool(false)

但是,如果我手动构造一个新User对象,则序列化工作正常,例如:

class DefaultController extends Controller
{
    public function serializeAction()
    {
        $userManager = // get the user manager
        $users = $userManager->findUsers();         
        $serializer = $this->get('jms_serializer');

        $user = new User();
        $user->setUsername('testusername');
        Debug::dump('Processing user: '.$user->getUsername());
        $result = $serializer->serialize($user, 'json');
        Debug::dump($result);
        /*return a response */
    }
}

有什么想法吗?我已经准备好为此失去理智了。

编辑:同样经过进一步思考,值得注意的是,我的序列化元数据看起来并没有得到尊重。如上所示,我只公开了用户名,但是当我在控制器中创建一个新用户名并对其进行序列化时,User我看到的不仅仅是公开的用户名,我看到的是username:、、、、、和enabledlockedexpiredrolescredentials_expired。我怀疑我会看到每个字段,如果它有非空数据。

编辑(2):我已经看到对使用DoctrineObjectConstructor默认对象构造函数的引用serializer;并采取了此答案中确定的步骤,希望他们可以解决我的问题。唉,他们没有(看起来那个答案和问题更适合反序列化)并且bool(false)的结果仍然存在。

编辑(3):序列化元数据没有被提取的问题,似乎是由于混合auto_detection和显式声明directories,如我问过的另一个问题所示:JMSSerializerBundle 混合自动检测和显式目录?

4

0 回答 0