Это моя первая попытка сериализации данных, и я не должен делать что-то правильно, потому что она не работает. Возможно, это потому, что класс, который я пытаюсь сериализовать, является делегатом или, возможно, из-за того, что я заполняю данные, или, возможно, миллион других вещей ошибочен. Может ли кто-нибудь, кто знает, как это сделать, взглянуть на мой код и дать мне несколько советов? Пожалуйста?Serialize/Deserialize encoder/decoder не работает
Заголовок файла: Файл
#import <Foundation/Foundation.h>
@protocol IDTemplateDelegate <NSObject>
- (void)saveTemplateForUI;
@end
@interface IDTemplate : NSObject <NSCoding>
@property (nonatomic) const char *templateData;
@property (nonatomic) NSUInteger templateSize;
@property (nonatomic) int templateQuality;
@property (nonatomic) int templateLocation;
@property (nonatomic, assign) id<IDTemplateDelegate> delegate;
@end
Реализация:
#import "IDTemplate.h"
@implementation IDTemplate
@synthesize delegate;
- (id)initWithCoder:(NSCoder *)decoder
{
self = [super init];
if (self) {
NSData *data = [decoder decodeObjectForKey:@"templateData"];
[data getBytes:(void *)_templateData length:_templateSize];
_templateSize = [decoder decodeIntegerForKey:@"templateSize"];
_templateQuality = [decoder decodeIntForKey:@"templateQuality"];
_templateLocation = [decoder decodeIntForKey:@"templateLocation"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder
{
NSData *data = [NSData dataWithBytes:_templateData length:_templateSize];
[encoder encodeObject:data forKey:@"templateData"];
[encoder encodeInteger:_templateSize forKey:@"templateSize"];
[encoder encodeInt:_templateQuality forKey:@"templateQuality"];
[encoder encodeInt:_templateLocation forKey:@"templateLocation"];
}
- (void)populateTemplate:(IDTemplate *)template
{
self.templateData = template.templateData;
self.templateSize = template.templateSize;
self.templateQuality = template.templateQuality;
self.templateLocation = template.templateLocation;
}
@end
телефонный код здесь:
self.template является указателем на то, что должно быть моим сериализованный класс. Может быть, я не могу так поступить?
- (void)generateTemplate:(cv::Mat)src
{
Template template = *([self.cpp generateTemplate:src]);
// self.template is a pointer to what should be my serialized class
// maybe I can't do it this way?
self.template = [[IDTemplate alloc] init];
self.template.delegate = self;
[self.template setTemplateData:template.getData()];
[self.template setTemplateSize:template.getSize()];
[self.template setTemplateQuality:template.getQuality()];
[self.template setTemplateLocation:template.getLocation()];
{// Setting up NSNotification for templateData
NSMutableDictionary *templateData = [NSMutableDictionary dictionaryWithCapacity:1];
[templateData setObject:self.template forKey:@"Template"];
NSNotificationCenter *templateNote = [NSNotificationCenter defaultCenter];
[templateNote postNotificationName:@"TemplateGenerated" object:nil userInfo:templateData];
}
}
Это поможет, если вы действительно предоставили информацию о проблеме. Не заставляйте нас читать код и догадываться. Какой у вас вопрос? – rmaddy
@rmaddy - Проблема в том, что я возвращаю значения в свой код вызова, но не в сериализованные значения. Я поставил точки останова в моем initWithCoder и encodeWithCoder, и он никогда не попадает туда. Мне интересно, не работает ли он, потому что мой класс IDTemplate является делегатом. У меня есть несколько книг, и я могу искать примеры, но я никогда не делал этого раньше, и я точно не знаю, как это сделать. Из того, что я прочитал, пока я использую делегат NSCoding, он должен просто работать. Возможно, я ошибаюсь. Спасибо за помощь. – Patricia
Что нужно вызывать 'initWithCoder' и' encodeWithCoder: '? Где вы пытаетесь сериализовать экземпляры 'IDTemplate'? – rmaddy