是否可以在IronPython中做到這一點,如果是這樣,如何?將IronPython類標記爲可序列化
3
A
回答
4
我被一個IronPython開發人員給出了這個例子,用於在python類(如Serializable)上添加.NET屬性。
http://ironpython.codeplex.com/releases/view/36280#DownloadId=116513
2
Python的序列化版本是Pickling(我相信)。 我不認爲一個類必須被標記爲可序列化。
所以,你必須這樣做:
進口CLR clr.AddReference( 「IronPython.Modules」)
從IronPython.Modules導入PythonPickle
存儲= PythonPickle.dumps(「ASDF 「) 恢復PythonPickle.loads(存儲)#recovered =是 「ASDF」
那麼,你可以defini tely一個標記爲可序列化...... 我看着here
,我能使其排序的序列化,以使BinaryFormatter的將採取它和序列化,但反序列化是不可能的:
from System.IO import File
from System.Runtime.Serialization.Formatters.Binary import BinaryFormatter #whew
from System.Runtime.Serialization import ISerializable, SerializationException
from System import SerializableAttribute, ObsoleteAttribute
from System.Reflection.Emit import OpCodes, CustomAttributeBuilder
from System.Security.Permissions import *
import clr
clr.AddReference("Microsoft.Dynamic")
clr.AddReference("IronPython")
from Microsoft.Scripting.Generation import Snippets
class ClrTypeMetaclass(type):
def __clrtype__(cls):
baseType = super(ClrTypeMetaclass, cls).__clrtype__()
typename = cls._clrnamespace + "." + cls.__name__ \
if hasattr(cls, "_clrnamespace") \
else cls.__name__
typegen = Snippets.Shared.DefineType(typename, baseType, True, False)
typebld = typegen.TypeBuilder
for ctor in baseType.GetConstructors():
ctorparams = ctor.GetParameters()
ctorbld = typebld.DefineConstructor(
ctor.Attributes,
ctor.CallingConvention,
tuple([p.ParameterType for p in ctorparams]))
ilgen = ctorbld.GetILGenerator()
ilgen.Emit(OpCodes.Ldarg, 0)
for index in range(len(ctorparams)):
ilgen.Emit(OpCodes.Ldarg, index + 1)
ilgen.Emit(OpCodes.Call, ctor)
ilgen.Emit(OpCodes.Ret)
if hasattr(cls, '_clrclassattribs'):
for cab in cls._clrclassattribs:
typebld.SetCustomAttribute(cab)
return typebld.CreateType()
def make_cab(attrib_type, *args, **kwds):
clrtype = clr.GetClrType(attrib_type)
argtypes = tuple(map(lambda x:clr.GetClrType(type(x)), args))
ci = clrtype.GetConstructor(argtypes)
props = ([],[])
fields = ([],[])
for kwd in kwds:
pi = clrtype.GetProperty(kwd)
if pi is not None:
props[0].append(pi)
props[1].append(kwds[kwd])
else:
fi = clrtype.GetField(kwd)
if fi is not None:
fields[0].append(fi)
fields[1].append(kwds[kwd])
else:
raise Exception, "No %s Member found on %s" % (kwd, clrtype.Name)
return CustomAttributeBuilder(ci, args,
tuple(props[0]), tuple(props[1]),
tuple(fields[0]), tuple(fields[1]))
def cab_builder(attrib_type):
return lambda *args, **kwds:make_cab(attrib_type, *args, **kwds)
Serializable = cab_builder(SerializableAttribute)
class Applesauce(ISerializable):
__metaclass__ = ClrTypeMetaclass
_clrnamespace = "Yummy.Yum.Food"
_clrclassattribs = [Serializable()]
def __init__(self):
self.sweetness = 10
def GetObjectData(self,info,context):
info.AddValue("sweetness",10)
binformatter = BinaryFormatter()
output = File.Create("applesauce.dat")
binformatter.Serialize(output,Applesauce())
output.Close()
當然,輸出文件只有「甜味」屬性序列化,因爲它在GetObjectData方法中,因爲它是info.AddValue(...)
因此,現在我認爲可以安全地得出結論:將其標記爲可在純IronPython中進行序列化。
相關問題
- 1. 爲什麼它需要將類標記爲可序列化?
- 2. 將類標記爲可序列化的缺點
- 3. ExtensionDataObject未標記爲可序列化
- 4. LuisResult沒有標記爲可序列化
- 5. SPUser未標記爲可序列化
- 6. Microsoft.Office.Interop.Excel.WorkbookClass'in Assembly'Microsoft.Office.Interop.Excel,未標記爲可序列化
- 7. Microsoft.WindowsAzure.Storage.Table.TableEntity未標記爲可序列化
- 8. MonoTouch:如何序列化未標記爲可序列化的類型(如CLLocation)?
- 9. 類型''in Assembly''未標記爲可序列化。 linq-to-sql
- 10. SerializationException:類型UnityEngine.GameObject未標記爲可序列化
- 11. Visual Studio設計:類型未標記爲可序列化
- 12. 類型'Tamir.SharpSsh.jsch.JSchException'未標記爲可序列化
- 13. 無法創建組件..類型不標記爲可序列化
- 14. 調試器可視化器和「類型不被標記爲可序列化」
- 15. 無法序列HttpWebRequest的(類型「System.Net.WebRequest + WebProxyWrapper」未標記爲可序列化。)
- 16. 未標記爲序列化錯誤,而該類實際上標記爲帶註釋的序列化
- 17. 將類序列化爲XML?
- 18. 派生自DependencyObject的類是否可以標記爲可序列化?
- 19. 在視圖列表中未標記爲可序列化
- 20. 標記爲[RemoteClass]的類中的序列化/反序列化回調
- 21. 爲什麼可序列化的內部類不可序列化?
- 22. 爲什麼二進制序列化要求將對象標記爲可序列化?
- 23. 如果基類被標記爲可序列化,所有子類都被標記了嗎?
- 24. 如何在標準序列化中序列化不可序列化的基類?
- 25. 調試:當類型爲標記爲可序列
- 26. 可序列化類
- 27. 將A類序列化爲B類java
- 28. 將類類型序列化爲JSON?
- 29. 在java中,我如何序列化一個沒有標記爲可序列化的類?
- 30. 如何解決'System.ServiceModel.ExceptionDetail'未標記爲可序列化
我認爲CodePlex項目是由DevHawk(與@ jcao219答案中的解決方案相同的開發人員)編寫的 - 所以它絕對值得通讀他的[解釋](http://devhawk.net/tag/__clrtype__)。它需要一些努力,但是那裏有很多好東西。 – Wesley 2011-10-01 16:08:07
fyi項目已移至github:https://github.com/IronLanguages/main/tree/ipy-2.7-maint/Languages/IronPython/Samples/ClrType – 2017-05-24 07:24:54