0

Это моя первая попытка сериализации данных, и я не должен делать что-то правильно, потому что она не работает. Возможно, это потому, что класс, который я пытаюсь сериализовать, является делегатом или, возможно, из-за того, что я заполняю данные, или, возможно, миллион других вещей ошибочен. Может ли кто-нибудь, кто знает, как это сделать, взглянуть на мой код и дать мне несколько советов? Пожалуйста?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]; 
    } 
} 
+0

Это поможет, если вы действительно предоставили информацию о проблеме. Не заставляйте нас читать код и догадываться. Какой у вас вопрос? – rmaddy

+0

@rmaddy - Проблема в том, что я возвращаю значения в свой код вызова, но не в сериализованные значения. Я поставил точки останова в моем initWithCoder и encodeWithCoder, и он никогда не попадает туда. Мне интересно, не работает ли он, потому что мой класс IDTemplate является делегатом. У меня есть несколько книг, и я могу искать примеры, но я никогда не делал этого раньше, и я точно не знаю, как это сделать. Из того, что я прочитал, пока я использую делегат NSCoding, он должен просто работать. Возможно, я ошибаюсь. Спасибо за помощь. – Patricia

+1

Что нужно вызывать 'initWithCoder' и' encodeWithCoder: '? Где вы пытаетесь сериализовать экземпляры 'IDTemplate'? – rmaddy

ответ

0

Я заметил, что в методе инициализации вы используете _templateSize для вашего прежде чем вы расшифровали его.

+1

Это решение проблемы, я думаю. – Mundi

+0

@Mundi После того, как я спал и смотрел комментарии ваших и rmaddy, я понял, что, возможно, я ошибаюсь в том, что я пытаюсь сделать. Я действительно не хочу записывать данные в файл. Я действительно хочу вывести значение char * в массив байтов. Я теряю значение указателя char *, когда мне нужно его получить. Поэтому я подумал, что сериализация может быть ответом. Теперь я второй догадываюсь об этом пути. Я проголосовал за ваш комментарий, но теперь, наверное, у меня есть новый вопрос. Спасибо. – Patricia

Смежные вопросы