3 votes

Erreur de marshalling lors de la mise en cache des modèles avec date antérieure à 1900

J'ai des modèles de record actifs qui ont un attribut "published_on". Lorsque j'essaie de mettre en cache des modèles avec une date de publication antérieure au 1/1/1900, je reçois une erreur telle que:

Erreur de marshalling pour la clé 'popular_products': année trop grande pour marshalliser : 1300 UTC
Vous essayez de mettre en cache un objet Ruby qui ne peut pas être sérialisé dans memcached.

Je peux reproduire une erreur similaire avec ruby:

irb(main)> Marshal.dump( Time.parse("1/1/1900") )
ArgumentError: année trop grande pour marshalliser : 1899 UTC

Quelle est la bonne approche pour mettre en cache des modèles avec des dates antérieures à 1900?

2voto

dkam Points 1559

Comme l'a commenté @j03w, il s'agit d'une limitation du type Time. J'ai choisi de changer le type en Date, ce qui a résolu le problème.

0voto

jmv Points 1

Vous pouvez également surcharger les méthodes _dump et _load de la classe Time, comme suit :

require 'time' # Extension de Time pour avoir la méthode xmlschema
class Time
  def _dump(level)
    xmlschema(9) # stocker nsec
  end
  def self._load(str)
    Time.parse(str)
  end
end

irb(main):013:0> t=Time.new(1515,1,1)
=> 1515-01-01 00:00:00 +0100
irb(main):014:0> a=Marshal.dump(t)
=> "\x04\bIu:\tTime(1515-01-01T00:00:00.000000000+01:00\x06:\x06ET"
irb(main):015:0> t==Marshal.load(a)
=> true

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X