【问题标题】:Why does JMS Serializer ignore mappings for nested collections?为什么 JMS Serializer 忽略嵌套集合的映射?
【发布时间】:2014-01-11 21:46:59
【问题描述】:

我在 OneToMany 关系中有实体:

预测 -> 有很多 -> 积木

我已经为 Resources/config/serializer/Entity.xxx.yml 中的每个创建了序列化映射,其中 xxx 是实体名称。

每个实体都将排除策略设置为 ALL,并且它的一些属性被公开,例如:

Acme\ForecastBundle\Entity\Forecast:   
  exclusion_policy: ALL   
  xml_root_name: forecast   
  properties:
    id:
      expose: true
      type: integer
    regionUid:
      expose: true
      type: string
    description:
      expose: true
      type: string
    bricks:
      expose: true
      type: array<Acme\ForecastBundle\Entity\Brick>
      xml_list:
        inline: true
        entry_name: brick

当我在我的模板中使用{{ forecast|serialize|raw }} 我得到:

预测 -> 正如我所料 -> 只有公开的字段被序列化

Bricks 集合 -> 所有属性都已序列化 -> 似乎我的 Entity.Brick.yml 被忽略了...为什么?

在砖中我只有 ID 和名称暴露.. 但在序列化输出中我有所有属性(created_at、updated_at.. 等等).. 为什么?它们应该被“exclusion_policy: ALL”排除。似乎没有使用嵌套集合的配置。

Acme\ForecastBundle\Entity\Brick:   
  exclusion_policy: ALL   
  xml_root_name: brick
  properties:
    id:
      expose: true
      type: integer
    name:
      expose: true
      type: string

编辑:

是的,每次更改 .yml 配置后我都会清除缓存

经过一些建议后,我在 Brick 类中添加了 @ExclusionPolicy("ALL") 注释,并在 ID 上添加了 @Expose,只是为了看看会发生什么......突然它起作用了!不仅暴露了 ID,而且一切都像我的 YML 配置一样。

所以我删除了注释.. 它仍然有效!

所以似乎添加注释以某种方式强制序列化程序识别我的 YML 配置。我不知道为什么。这让我很担心。

APC 缓存是否有罪?我确实多次清除 Symfony2 缓存,但 APC 只清除了几次。

【问题讨论】:

  • 如果你只序列化一个单独的砖会发生什么?也尝试使用rm -r app/cache清除缓存
  • 独立程序块已正确序列化。我确实清除了 Symfony2 缓存。现在我想它可能是 APC 缓存。但这可能吗?
  • 我总是遇到 jms-bundles 缓存的问题...无论如何缓存中的问题
  • app/console cache:clear 不够用,需要通过rm -rf var/cache/ 移除(对于SF4.x)

标签: symfony serialization jmsserializerbundle


【解决方案1】:

由于没有回答者,我将发布我最终所做/发现的事情(以供将来参考和遇到相同问题的任何人)。我将引用我的编辑:

经过一些建议后,我在 Brick 类中添加了 @ExclusionPolicy("ALL") 注释,并在 ID 上添加了 @Expose,只是为了看看会发生什么......突然它起作用了!不仅暴露了 ID,而且一切都像我的 YML 配置一样。

所以我删除了注释.. 它仍然有效!

所以似乎添加注释以某种方式迫使序列化程序识别我的 YML 配置。我不知道为什么。这让我很担心。

【讨论】:

  • 这正是发生在我身上的事情......我试图让它工作好几天。任何人都可以找到是否记录了此功能?
  • 更新:你试过清除缓存吗?我试图重现这种现象,有几次,我意识到 app/console cache:clear 没有清除 jms_serializer 缓存,导致了这种行为。向实体添加注释会强制重新创建缓存。
【解决方案2】:

显然添加了 use JMS\Serializer\Annotation\ExclusionPolicy;到实体就够了。

我猜它不起作用,因为我们没有实现该类来这样做。

【讨论】:

  • 这更像是一个评论而不是一个答案。
猜你喜欢
  • 2015-01-28
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 2014-08-10
  • 2016-01-07
  • 2020-12-12
  • 2021-08-16
  • 1970-01-01
相关资源
最近更新 更多