کار با Protobuf Types

از آنجایی که API گوگل ادز از proto3 به عنوان قالب پیش‌فرض بارگذاری خود استفاده می‌کند، درک چند قرارداد و نوع protobuf هنگام کار با API مهم است.

فیلدهای اختیاری

بسیاری از فیلدها در API گوگل ادز به عنوان optional علامت‌گذاری شده‌اند. این به شما امکان می‌دهد بین مواردی که فیلد دارای مقدار خالی است و مواردی که سرور مقداری برای فیلد ارسال نکرده است، تمایز قائل شوید. این فیلدها مانند فیلدهای معمولی رفتار می‌کنند، با این تفاوت که متدهای اضافی برای پاک کردن فیلد و بررسی تنظیم بودن فیلد نیز ارائه می‌دهند.

برای مثال، فیلد Name شیء Campaign به عنوان اختیاری علامت‌گذاری شده است. بنابراین می‌توانید از روش‌های زیر برای کار با این فیلد استفاده کنید.

// Get the name.
string name = campaign.Name;

// Set the name.
campaign.Name = name;

// Check if the campaign object has the name field set.
bool hasName = campaign.HasName();

// Clear the name field. Use this method to exclude Name field from
// being sent to the server in a subsequent API call.
campaign.ClearName();

// Set the campaign to empty string value. This value will be
// sent to the server if you use this object in a subsequent API call.
campaign.Name = "";

// This will throw a runtime error. Use ClearName() instead.
campaign.Name = null;

فیلدهای تکراری

یک آرایه فیلد در API گوگل ادز به صورت یک RepeatedField فقط خواندنی نمایش داده می‌شود.

به عنوان مثال، فیلد url_custom_parameters یک کمپین، یک فیلد تکراری است، بنابراین به عنوان یک RepeatedField<CustomParameter> فقط خواندنی در کتابخانه کلاینت .NET نمایش داده می‌شود. RepeatedField رابط IList<T> را پیاده‌سازی می‌کند.

دو روش برای پر کردن فیلد RepeatedField وجود دارد.

روش AddRange

 Campaign campaign = new Campaign()
 {
     ResourceName = ResourceNames.Campaign(customerId, campaignId),
     Status = CampaignStatus.Paused,
 };

 // Add values to UrlCustomParameters using AddRange method.
 campaign.UrlCustomParameters.AddRange(new CustomParameter[]
 {
     new CustomParameter { Key = "season", Value = "christmas" },
     new CustomParameter { Key = "promocode", Value = "NY123" }
 });
 ```

نحو مقداردهی اولیه مجموعه

// Option 1: Initialize the field directly.
Campaign campaign = new Campaign()
{
    ResourceName = ResourceNames.Campaign(customerId, campaignId),
    Status = CampaignStatus.Paused,
    // Directly initialize the field.
    UrlCustomParameters =
    {
        new CustomParameter { Key = "season", Value = "christmas" },
        new CustomParameter { Key = "promocode", Value = "NY123" }
    }
};

// Option 2: Initialize using an intermediate variable.
CustomParameter[] parameters = new CustomParameter[]
{
    new CustomParameter { Key = "season", Value = "christmas" },
    new CustomParameter { Key = "promocode", Value = "NY123" }
}

Campaign campaign1 = new Campaign()
{
    ResourceName = ResourceNames.Campaign(customerId, campaignId),
    Status = CampaignStatus.Paused,
    // Initialize from an existing array.
    UrlCustomParameters = { parameters }
};

یکی از فیلدها

برخی از فیلدها در API گوگل ادز به عنوان فیلدهای oneof علامت‌گذاری شده‌اند، به این معنی که فیلد می‌تواند انواع مختلفی را در خود جای دهد اما در یک زمان معین فقط یک مقدار دارد. فیلدهای oneof شبیه به نوع union در زبان برنامه‌نویسی C هستند.

کتابخانه‌ی دات‌نت، فیلدهای oneof را با ارائه‌ی یک ویژگی برای هر نوع مقداری که می‌تواند در یک فیلد oneof نگهداری شود، پیاده‌سازی می‌کند و تمام ویژگی‌ها یک فیلد کلاس مشترک را به‌روزرسانی می‌کنند.

برای مثال، campaign_bidding_strategy کمپین به عنوان فیلد oneof علامت‌گذاری شده است. این کلاس به صورت زیر پیاده‌سازی شده است (کد برای اختصار ساده شده است):

public sealed partial class Campaign : pb::IMessage<Campaign>
{
    object campaignBiddingStrategy_ = null;
    CampaignBiddingStrategyOneofCase campaignBiddingStrategyCase_;

    public ManualCpc ManualCpc
    {
        get
        {
            return campaignBiddingStrategyCase_ == CampaignBiddingStrategyOneofCase.ManualCpc ?
                (ManualCpc) campaignBiddingStrategy_ : null;
        }
        set
        {
            campaignBiddingStrategy_ = value;
            campaignBiddingStrategyCase_ = CampaignBiddingStrategyOneofCase.ManualCpc;
        }
    }

    public ManualCpm ManualCpm
    {
        get
        {
            return campaignBiddingStrategyCase_ == CampaignBiddingStrategyOneofCase.ManualCpm ?
                (ManualCpm) campaignBiddingStrategy_ : null;
        }
        set
        {
            campaignBiddingStrategy_ = value;
            campaignBiddingStrategyCase_ = CampaignBiddingStrategyOneofCase.ManualCpm;
        }
    }

    public CampaignBiddingStrategyOneofCase CampaignBiddingStrategyCase
    {
        get { return campaignBiddingStrategyCase_; }
    }
}

از آنجایی که oneof ویژگی‌ها فضای ذخیره‌سازی را به اشتراک می‌گذارد، یک تخصیص می‌تواند تخصیص قبلی را بازنویسی کند و منجر به اشکالات جزئی شود. برای مثال،

Campaign campaign = new Campaign()
{
    ManualCpc = new ManualCpc()
    {
        EnhancedCpcEnabled = true
    },
    ManualCpm = new ManualCpm()
    {

    }
};

در این حالت، campaign.ManualCpc اکنون null است زیرا فیلد campaign.ManualCpm مقداردهی اولیه قبلی برای campaign.ManualCpc را بازنویسی می‌کند.

تبدیل به فرمت‌های دیگر

تبدیل به فرمت JSON

شما می‌توانید اشیاء protobuf را به فرمت JSON و برعکس تبدیل کنید. این قابلیت هنگام ساخت سیستم‌هایی که نیاز به ارتباط با سیستم‌های دیگری دارند که به داده‌هایی با فرمت‌های متنی مانند JSON یا XML نیاز دارند، مفید است.

GoogleAdsRow row = new GoogleAdsRow()
{
    Campaign = new Campaign()
    {
        Id = 123,
        Name = "Campaign 1",
        ResourceName = ResourceNames.Campaign(1234567890, 123)
    }
};

// Serialize to JSON and back.
string json = JsonFormatter.Default.Format(row);
row = GoogleAdsRow.Parser.ParseJson(json);

تبدیل به بایت

شما می‌توانید یک شیء را به بایت و برعکس سریالایز کنید. سریالایز باینری در مقایسه با فرمت JSON از نظر حافظه و ذخیره‌سازی کارآمدتر است.

GoogleAdsRow row = new GoogleAdsRow()
{
    Campaign = new Campaign()
    {
        Id = 123,
        Name = "Campaign 1",
        ResourceName = ResourceNames.Campaign(1234567890, 123)
    }
};
// Serialize to bytes and back.
byte[] bytes = row.ToByteArray();
row = GoogleAdsRow.Parser.ParseFrom(bytes);