首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用批注组序列化

用批注组序列化
EN

Stack Overflow用户
提问于 2019-02-08 20:21:45
回答 1查看 1.3K关注 0票数 1

Symfony v4.2

我正在尝试使用symfony的规范化器和序列化程序将我的实体转换为JSON。

我遵循组注释模式,因为这听起来是最直观和未来的证明方法。

根据医生们,我们必须手动实例化ClassMetadataFactory以加载AnnotationLoader。我仍然在使用ObjectNormalizer,它在使用注释之前工作得很好。

下面是我的序列化方法:

代码语言:javascript
运行
复制
/**
 * @param bool $event Serialize all event fields (except references)
 * @param bool $meta Serialize referenced meta instance
 * @param bool $targets Serialize referenced target instances
 * @param bool $users Serialize referenced user instances
 * @param bool $videos Serialize referenced video instances
 * @param bool $photos Serialize referenced photo instances
 * @return string
 */
public function serialize($event = true, $meta = false, $targets = false, $users = false, $videos = false, $photos = false) {
    $serializingGroups = [];
    if ($event) {
        $serializingGroups[] = 'event';
    }
    if ($meta) {
        $serializingGroups[] = 'meta';
    }
    if ($targets) {
        $serializingGroups[] = "targets";
    }
    if ($users) {
        $serializingGroups[] = 'users';
    }
    if ($videos) {
        $serializingGroups[] = 'videos';
    }
    if ($photos) {
        $serializingGroups[] = 'photos';
    }

    $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
    $normalizer = new ObjectNormalizer($classMetadataFactory);
    $serializer = new Serializer([$normalizer], [new JsonEncoder()]);

    $data = $serializer->normalize($this, null, ['groups' => $serializingGroups]);
    return $serializer->serialize($data, 'json');
}

如果我不需要序列化关联,那么这些组就是为了加速序列化。

现在我使用了组注释,json看起来如下所示

代码语言:javascript
运行
复制
"{"id":2,
"title":"test",
"description":"<p>&nbsp;test<\/p>",
"subscriptionPrice":"0.00",
"subscriptionUntil":[], // DATE  - WHY EMPTY ARRAY?
"start":[], // DATE  - WHY EMPTY ARRAY?
"end":[], // DATE  - WHY EMPTY ARRAY?
"allDay":false,
"creationDate":[], // DATE  - WHY EMPTY ARRAY?
"editDate":[], // DATE  - WHY EMPTY ARRAY?
"editable":true,
"startEditable":true,
"durationEditable":true,
"overlap":false,
"color":"#9EABAB",
"backgroundColor":"#9eabab",
"borderColor":"#9eabab",
"textColor":"#000000",
"isRecurring":true,
"meta":[], // ASSOCIATED ENTITY  - WHY EMPTY ARRAY?
"targets":[[]] // ASSOCIATED COLLECTION OF ENTITIES  - WHY EMPTY ARRAY?
}"

当我不使用注释时,它为什么会工作呢?为什么当我使用注释时,日期和其他实体都是空数组?

EN

Stack Overflow用户

回答已采纳

发布于 2019-02-10 20:33:58

尤雷卡!

下面是我的序列化方法中的代码片段:

代码语言:javascript
运行
复制
$classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
$normalizer = new ObjectNormalizer($classMetadataFactory);
$serializer = new Serializer([
    // Add a Datetimenormalizer as the first normalizer in the list
    new DatetimeNormalizer(),
    $normalizer
], [new JsonEncoder()]);

return $serializer->serialize($this, 'json', [
    // $serializer->addCircularReferenceHandler() IS DEPRECATED
    // define the handler like this:
    ObjectNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($event) {
        return '/event/'.$event->id;
    }
    ,ObjectNormalizer::GROUPS => $serializingGroups
]);

首先,metatargets没有序列化的原因是因为我在MetaTarget实体中导入了错误的内容。确保它是:use Symfony\Component\Serializer\Annotation\Groups;..。所以..。嗯..。继续前进。

当我注释掉//,ObjectNormalizer::GROUPS => $serializingGroups时,日期确实序列化了。那么,当组未被注释掉时,它们为什么不序列化呢?我的猜测是,DateTime类没有Groups注释,因此规范化器永远无法获得任何DateTime属性

通过在数组中添加一个DatetimeNormalizer作为第一个规范化器来解决这个问题:$serializer = new Serializer([new DatetimeNormalizer(),$normalizer])

这是我的实体正确序列化的方式:D

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54599652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档