Сериализиране на IronPython обекти, които наследяват от CLR типове

Това може да е малко странен въпрос, но има ли надежден начин за сериализиране на IronPython обекти, чиито класове разширяват CLR типовете?

Например:

class Foo(System.Collections.Generic.List[str]):
    def Test(self):
        print "test!"

System.Collections.Generic.List<string> може да се сериализира с Pickle, тъй като имплементира интерфейса ISerializable, но излъчваните подкласове на сериализируеми CLR типове изглежда не работят и получавам ImportError: No module named Generic in mscorlib, Version=4, когато изпълнявам pickle.dumps(Foo()).

Освен това, стартирането на обичайния Formatter.Serialize(stream, object) ми дава:

SystemError: Type 'IronPython.NewTypes.System.Collections.Generic.List`1_4$4' in Assembly Snippets.scripting, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

Как мога да внедря сериализация на обекти на IronPython, когато се изпълнява във вградена C# среда?


person Community    schedule 17.09.2010    source източник


Отговори (2)


Цитат от clrtype метакласове

Днес IronPython не поддържа базирани на отражение API или персонализирани атрибути, тъй като IronPython не излъчва персонализирани CLR типове за всеки клас на Python. Вместо това, той обикновено споделя един тип CLR в много класове на Python. Например и трите от тези класове на Python споделят един основен CLR тип.

class shop(object):
  pass 

class cheese_shop(shop):
  def have_cheese(self, cheese_type):
    return False

class argument_clinic(object):
  def is_right_room(self, room=12):
    return "I've told you once"

import clr
print clr.GetClrType(shop).FullName
print clr.GetClrType(cheese_shop).FullName
print clr.GetClrType(argument_clinic).FullName 

Въпреки че cheese_shop наследява от shop и argument_clinic наследява от object, и трите класа споделят един и същ основен CLR тип

Не съм опитвал, но може би можете да разрешите този проблем с ръчно сериализиране чрез сурогати за сериализация.

person desco    schedule 17.09.2010

Не знам дали това е, което търсите, но можете да помислите за Python версията на protobuf (тук)? Не съм го тествал конкретно на ironpython, имайте предвид. Това има допълнителното предимство, че има и реализации на C#, които могат да помогнат, като същевременно го поддържат независим от платформата. Когато е възможно искам да накарам protobuf-net да поддържа типове DLR, но това е голяма работа.

Като странична бележка, лично аз бих препоръчал да имате специален тип DTO, вместо да се опитвате да разширите вградените типове.

person Marc Gravell    schedule 17.09.2010
comment
Просто използвам System.Collections.Generic<string> като пример -- имам свои собствени CLR типове в моето събрание, за които съм внедрил ISerializable и които искам да сериализирам. - person ; 17.09.2010