मैं सी # करने के लिए एक जावा खेल को परिवर्तित कर रहा हूँ (पिल्ला खेलों द्वारा टाइटन हमलों) और काफी अब पिछले कार्य जो खेल राज्य की क्रमबद्धता है से अलग किया हूँ फ़ाइलों को बचाने के लिए।नेट क्रमबद्धता - मिश्रण [Serializable] विरासत पेड़ में कस्टम के साथ
ठेठ पदानुक्रम: संसाधन (आधार) -> सुविधा-> स्क्रीन/प्रभाव/Entity-> GameScreen/LaserEffect/हमलावर
जावा कोड का उपयोग करता मानक ObjectOutputStream/ObjectInputStream द्विआधारी क्रमांकन प्रदर्शन करने के लिए, लेकिन annoyingly कुछ readResolve करता है/आधार वर्ग स्तर (संसाधन) पर writeResolve काम क्रमबद्धता प्रक्रिया अनुकूलित करने के लिए (यदि एक संसाधन के नाम पर है यह यह क्रमानुसार नहीं करता है और बस एक ऐसा नाम है जो बाद में प्रयोग किया जाता है एक hashmap से बाहर लाने के लिए संसाधन के साथ एक प्रॉक्सी रिटर्न)।
मेरे अनुभवहीन समाधान आँख बंद करके इस दृष्टिकोण को कॉपी और प्रकार ओवरराइड करने के लिए आधार वर्ग में ISerializable लागू करने के लिए ...
public virtual void GetObjectData(SerializationInfo info, StreamingContext context) {
if (name != null) {
// Got a name, so send a SerializedResource that just references us
info.AddValue("name", this.name);
info.SetType(typeof(SerializedResource));
return;
}
//Serialize just MY fields (defined in Resource)
this.SerializeMyFields(info, context, typeof(Resource));
}
क्यू है) तो, मैं बहुत सुनिश्चित करें कि सभी दांव के लिए बनाया गया बंद कर रहे हैं हूँ सीरियलाइजेशन में और मुझे सीरियलाइजेशन कन्स्ट्रक्टर के साथ विरासत श्रृंखला के नीचे सभी तरह से ISerializable लागू करना है?
नोट GetObjectData आभासी इसलिए व्युत्पन्न वर्ग को अपने खेतों को क्रमानुसार सकते हैं और फिर आधार वर्ग कहते हैं। यह काम करता है लेकिन यह कक्षाओं (100 के दशक) में बहुत कठिन काम करने का एक टन है।
कुछ व्युत्पन्न प्रकार (स्प्राइट, InvaderBehaviour, आदि) भी कस्टम क्रमांकन काम को मामले को बदतर बनाने के लिए।
मैं इस विषय पर जेफरी रिक्टर लेख में देखा है और एक ResourceSurrogateSelector का उपयोग कर की कोशिश की: बजाय ISerializationSurrogate प्रकार निर्माण लेकिन उन क्रमबद्धता तरीकों यदि प्रकार धारावाहिक की जा रही ही कहा जाता हो एक संसाधन है और एक प्रकार संसाधन से प्राप्त होता है (यानी होगा एक हमलावर या GameScreen)
क्यू) वहाँ यह करने के लिए एक स्मार्ट तरीका है serializing नहीं बुलाया हो सकते हैं?
मैंने दो कोड-बेस को एक-दूसरे के बहुत करीब रखने में कामयाब रहा है और इसने रूपांतरण को और अधिक आसान बना दिया है - मैं यहां इस दृष्टिकोण को जारी रखना चाहता हूं (इसलिए कोई XmlSerializer, Protobuf, आदि) जब तक कोई नहीं है वास्तव में अनिवार्य कारण नहीं है।
मैंने प्रक्रिया को स्वचालित करने के लिए कुछ जावा लिखने के बारे में सोचा है और सीरियलज़ेबल इंटरफेस को लागू करने वाले प्रकारों को प्रतिबिंबित करते हैं और सभी .NET क्रमबद्धता कोड के साथ एक .cs फ़ाइल बनाते हैं ताकि मैं मुख्य वर्ग फ़ाइलों को प्रदूषित न करूं (मैं उन्हें आंशिक बना दूंगा)
पीएस - लक्ष्य प्लेटफॉर्म विंडोज 8/सतह/एक्सबॉक्स 360 चीजों के नेट पक्ष (इसलिए संस्करण 4) और शायद पीएस वीटा/शायद आईओएस का उपयोग कर आईओएस पर होगा। बचाता है प्लेटफॉर्म पर deserialized वे serialized थे।
संपादित इस पोस्ट में सेर्गेई Teplyakov द्वारा एक उत्तर .... .NET, C#: How to add a custom serialization attribute that acts as ISerializable interface ... मेरे ISurrogateSelector इंटरफ़ेस जो है जैसे कि यह वांछित व्युत्पन्न वर्ग का चयन के साथ मदद मिलेगी लग रहा है के लिए प्रेरित किया।